2014-09-26 2 views
3

Я узнал, что django 1.7 теперь поддерживает метод update_or_create() в наборе запросов. Но когда я пытаюсь, он не работает. Там нет ни одного объекта создается, когда я пытаюсь этот:update_or_create не обновлять/создавать объекты

models.py

class Model1(models.Model): 
    name = models.CharField(max_length=100) 
    status = models.CharField(max_length=100) 
    user = models.ForeignKey(User, null=True, blank=True) 

class Model2(models.Model) 
    model = models.ForeignKey(Model1, null=True, blank=True) 
    field1 = models.CharField(max_length=100) 
    field2 = models.CharField(max_length=100) 
    user = models.ForeignKey(User, null=True, blank=True) 

views.py

def ModelUpdate(request) 
    model1 = get_object_or_404(Model1, pk=request.POST['lid']) 
    model1.status =2 
    model1.save() 

    #based on the model1, we want to create or update model2 
    datadict ={'field1' : 1, 'field2':2,} 
    model2, created = Model2.objects.update_or_create(model=model1, 
                 defaults=datadict) 
    if created: 
     print('model2 obj created') #for checking purpose 
    else: 
     print('model2 obj not created') 

    return render(request,'updated.html', {'update':'updated'}) 

Я могу видеть сообщение model2 OBJ создал но объект не был сохранен в базе данных. В чем может быть проблема?

UPDATE

Оказывается, это была моя ошибка. В Model2 я определил метод сохранения без возврата super(Model2, self).save(*args, **kwargs)
Вот почему он не сохранил объекты.

+0

Как вы проверочных, что объект был создан? –

+0

Из [документации] (https://docs.djangoproject.com/en/1.7/ref/models/querysets/#update-or-create) 'created' является логическим, определяющим, был ли создан новый объект. Кроме того, я просмотрел базу данных Model2, запись не была добавлена. –

ответ

5

Возможно, вы проверяете не так, потому что я создал проект с вашими моделями, и все работает нормально. В моем случае я проверочной этот объект был создан/обновлен с objects.get() и печати значений:

In [1]: from app1 import models 

In [2]: m1 = models.Model1.objects.create(name=1, status=1) 

In [3]: m1 
Out[3]: <Model1: Model1 object> 

In [4]: datadict ={'field1' : 1, 'field2':2,} 

In [6]: model2, created = models.Model2.objects.update_or_create(model=m1, defaults=datadict) 

In [7]: model2, created 
Out[7]: (<Model2: Model2 object>, True) 

In [8]: models.Model2.objects.get().field1, models.Model2.objects.get().field2 
Out[8]: (u'1', u'2') 

In [9]: datadict ={'field1' : 3, 'field2':4} 

In [10]: model2, created = models.Model2.objects.update_or_create(model=m1, defaults=datadict) 

In [11]: model2, created 
Out[11]: (<Model2: Model2 object>, False) 

In [12]: models.Model2.objects.get().field1, models.Model2.objects.get().field2 
Out[12]: (u'3', u'4') 

и

In [13]: models.Model2.objects.get().model.id 
Out[13]: 1 

In [14]: models.Model1.objects.get().id 
Out[14]: 1 
+0

Но в [документации] (https://docs.djangoproject.com/en/1.7/ref/models/querysets/#update-or-create) он говорит, что «created» является логическим, определяющим, был ли новый объект создано. Итак, я думаю, когда он Истинный означает, что объект создан. Я не использовал 'objects.get()' для проверки, я посмотрел непосредственно в таблице model2 базы данных. Но объект не был создан. О, да, я просто обновляюсь с 1.6.5, это обновление имеет к этому какое-то отношение? –

+0

Да, boolean 'created' означает, что объект был создан. Как вы можете видеть в первый раз, это было «true», но в следующем «false», поэтому он работает правильно. Я могу предположить, что вы не обновили соединение db, где вы его просматривали. Еще одна вещь, которую вы можете сделать - открыть журналы базы данных с помощью 'tail -f' и посмотреть, что там происходит. Я не думаю, что это проблема обновления. – coldmind

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