【问题标题】:Check if object with ManyToMany field already exists for each object from a list检查列表中每个对象是否已经存在具有 ManyToMany 字段的对象
【发布时间】:2014-08-28 06:13:09
【问题描述】:

我有两个模型:模式和类别。

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 中的每个模式是否已经存在,并正确修改它的manytomany <some_pattern>.categories 字段。

现在我这样做如下(valid 是模式列表,categories 是某些类别的查询集):

for pattern in valid:
    obj, created = Pattern.objects.get_or_create(name=pattern)
    if created:
        obj.categories = categories
    else:
        obj.categories.add(*categories)

如何使用尽可能少的 sql 查询来做同样的事情?

【问题讨论】:

  • 您的 name 在 Pattern 表中是唯一的吗?
  • 解决方案的关键是使用 bulk_create

标签: django django-queryset


【解决方案1】:

所以解决方案如下:

# 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)

【讨论】:

  • 好吧,这不是完全等效的代码,因为在这种情况下,您不会创建新的(错过的)Patterns,而只会获取现有的。我猜你还应该使用bulk_create 作为Pattern 对象。
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 2012-09-26
  • 1970-01-01
  • 2013-02-08
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多