我们有 models.py 文件:
class Car(models.Model):
brand = models.CharField(max_length=50 , null=True , blank=True)
sub_brand = models.CharField(max_length=50 , null=True , blank=True)
code = models.CharField(max_length=20 , unique=True)
class Skill(models.Model):
car = models.ForeignKey(Car , on_delete=models.CASCADE, null=True , blank=True)
skill = models.CharField(max_length=50 , null=True , blank=True)
class Provider(models.Model):
name = models.CharField(max_length=100)
skills = models.ManyToManyField(Skill , blank=True)
我们想在提供者模型中添加一些基于汽车的技能,所以我像这样使用views.py:
def skills_add(request , id):
provider = get_object_or_404(Provider , id=id)
if request.method == 'POST':
form = AddSkill(request.POST)
if form.is_valid():
data = form.cleaned_data
cars = Car.objects.filter(brand=data['brand'])
for i in cars:
for x in data['skills']:
skill = Skill.objects.get(car=i , skill=x)
provider.skills.add(skill)
provider.save()
else:
return redirect("managers:dashboard_manager")
return redirect(request.META.get('HTTP_REFERER'))
data["brand"] 是一个汽车品牌的字符串,data["skills"] 是一个字符串列表,其中每个字符串都是我们在数据库中拥有的一项技能的名称。 您将数据发送到表单,然后它开始过滤该品牌的汽车。之后,我们开始循环那些汽车并循环发送的技能。我们将其中每一项都添加到提供商的技能字段中。
但是这段代码的问题是它真的很慢! 为此我能做什么?
通过在 django 中使用一些查找解决了这个问题。 所以views.py必须是这样的:
def skills_add(request , id):
provider = get_object_or_404(Provider , id=id)
if request.method == 'POST':
form = AddSkill(request.POST)
if form.is_valid():
data = form.cleaned_data
if data['brand'] and data['sub_brand'] == "all":
cars = Car.objects.filter(brand=data['brand'])
else:
cars = Car.objects.filter(brand=data['brand'] , sub_brand=data['sub_brand'])
skill = Skill.objects.filter(car__in=cars , skill__in=data['skills']).values_list('id' , flat=True)
provider.skills.add(*skill)
provider.save()
else:
return redirect("managers:dashboard_manager")
return redirect(request.META.get('HTTP_REFERER'))
这样可以将函数速度提高约x10倍!