2013-10-03 3 views
1

У меня есть простая модель с именем ключевого слова:Джанго: model.objects.create() изменяет предыдущую model.objects.filter() 's ResultSet

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

Я пытаюсь сделать bulk_create, но объемные данные могут содержать уже существующие ключевые слова, поэтому я выполняю операцию в два этапа. Сначала выберите существующие ключевые слова, затем 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 и создать обновления результирующего предыдущего фильтра. Скорее всего, это ошибка, но я также могу пропустить некоторый момент здесь. Что-то не так в моей реализации?

Версия Django - 1.5.3.

+0

так что проблема в том, что существующие результаты показывают 2 вместо 1? кажется, что он переоценивает фильтр. – jproffitt

ответ

2

Запросы Django оцениваются лениво, когда значения фактически извлекаются. Если вы хотите сохранить одну и ту же последовательность моделей, вам необходимо передать их, например. конструктор list, чтобы упростить их.

existinglist = list(existing) 
+0

А мне плохо. Я думал, что existing.values_list в [17] уже оценивал набор запросов. Спасибо. – hinoglu

+0

@hinoglu: Это было. Но потом его снова оценили в 19, а затем в 22. –

+0

Смутно. Возможно, я потерял трек по деталям ордена джанго и оценки. IIRC django не переоценивал набор результатов, если он уже был оценен, и используется значение оценки, и это кажется совершенно неправильным тогда? – hinoglu

Смежные вопросы