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)