Django 检查列表中的每个对象是否已存在具有多个字段的对象

Django 检查列表中的每个对象是否已存在具有多个字段的对象,django,django-queryset,Django,Django Queryset,我有两种模式:模式和类别 class Pattern(models.Model): name = models.CharField(max_length=255, default=u'') categories = models.ManyToManyField(Category, related_name='patterns') def __unicode__(self): return u"{}".format(self.name) class Ca

我有两种模式:模式和类别

class Pattern(models.Model):
    name = models.CharField(max_length=255, default=u'')
    categories = models.ManyToManyField(Category, related_name='patterns')

    def __unicode__(self):
        return u"{}".format(self.name)

class Category(models.Model):
    name = models.CharField(max_length=255, default=u'')

    def __unicode__(self):
        return u"{}".format(self.name)
我需要检查
中的每个模式是否有效
是否已经存在,并正确修改其许多
类别
字段

现在我按如下方式操作(
valid
是一个模式列表,
categories
是一些类别的查询集):


如何使用尽可能少的sql查询实现同样的功能?

因此解决方案如下所示:

# finding out patterns that not exist in database and creating them
exist = Pattern.objects.filter(name__in=valid)
Pattern.objects.bulk_create([Pattern(name=p) for p in valid if p not in [unicode(pat) for pat in exist]])

# creating new relations
patterns_to_set_category = Pattern.objects.filter(name__in=valid)
relations_to_create = list()
for category in categories:
    for pattern in patterns_to_set_category:
        relations_to_create.append(Pattern.categories.through(pattern=pattern, category=category))
Pattern.categories.through.objects.bulk_create(relations_to_create)

您的
名称
在整个模式表中是否唯一?解决方案的关键是使用bulk_createwell,这不是完全等效的代码,因为在这种情况下,您不会创建新的(缺失的)
模式
而只获取现有的。我想,您还应该为
模式
对象使用
bulk\u create
# finding out patterns that not exist in database and creating them
exist = Pattern.objects.filter(name__in=valid)
Pattern.objects.bulk_create([Pattern(name=p) for p in valid if p not in [unicode(pat) for pat in exist]])

# creating new relations
patterns_to_set_category = Pattern.objects.filter(name__in=valid)
relations_to_create = list()
for category in categories:
    for pattern in patterns_to_set_category:
        relations_to_create.append(Pattern.categories.through(pattern=pattern, category=category))
Pattern.categories.through.objects.bulk_create(relations_to_create)