Django:model.objects.create()改变了以前的model.objects.filter()的结果集

时间:2013-10-03 00:29:12

标签: python django django-orm

我有一个名为Keyword的简单模型:

class Keyword(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)

我尝试执行bulk_create,但批量数据可能包含已存在的关键字,因此我分两步执行操作。首先获取现有关键字,然后批量创建新关键字。以下是我在此过程中所做工作的一个小例子:

In [12]: t = ["aaaa", "dene"]

In [16]: existing = Keyword.objects.filter(name__in=t).all()

In [17]: new = set(t).difference(list(existing.values_list("name", flat=True)))                                

In [18]: new
Out[18]: {'aaaa'}

In [19]: existing
Out[19]: [<Keyword: dene>]

In [20]: created = Keyword.objects.bulk_create([Keyword(name=name) for name in new])                           

In [21]: created
Out[21]: [<Keyword: aaaa>]

In [22]: existing
Out[22]: [<Keyword: aaaa>, <Keyword: dene>]

bulk_create和create都会更新前一个过滤器的结果集。这很可能是一个错误,但我也可能在这里遗漏一些问题。我的实施有什么不对吗?

Django版本是1.5.3。

1 个答案:

答案 0 :(得分:2)

当实际检索到值时,会懒惰地评估Django查询集。如果你想保持相同的模型序列,那么你需要将它们传递给例如list构造函数,以巩固它们。

existinglist = list(existing)