Django:如何快速向多个对象的ManyToManyFields添加对象?

问题描述 投票:0回答:1

我们有 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"] 是一个字符串列表,其中每个字符串都是我们在数据库中拥有的一项技能的名称。 您将数据发送到表单,然后它开始过滤该品牌的汽车。之后,我们开始循环那些汽车并循环发送的技能。我们将其中每一项都添加到提供商的技能字段中。

但是这段代码的问题是它真的很慢! 为此我能做什么?

python django rest orm
1个回答
0
投票

通过在 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倍!

© www.soinside.com 2019 - 2024. All rights reserved.