2014-09-26 74 views
3

我發現,Django 1.7現在支持queryset中的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

你是如何驗證創建對象? – 2014-09-26 09:31:54

+0

從他們的[文檔](https://docs.djangoproject.com/en/1.7/ref/models/querysets/#update-or-create)'created'是一個布爾值,指定是否創建了一個新對象。另外,我查看了Model2的數據庫,沒有添加記錄。 – 2014-09-26 12:21:16

回答

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

但是在[documentation](https://docs.djangoproject.com/en/1.7/ref/models/querysets/#update-or-create)中,它表示'created'是一個布爾值,指定新對象是否創建。所以,我猜是什麼時候它是真的意味着對象被創建。我沒有使用'objects.get()'來檢查,我直接看了數據庫model2表。但沒有創建任何對象。哦..是的,我只是從1.6.5升級而來,這個升級與它有什麼關係? – 2014-09-26 12:19:27

+0

是的,布爾'創建'意味着對象被創建。正如你第一次看到它是'真的',但是在下一個'假'中看到的,所以它正常工作。我可以假設你沒有更新數據庫連接,你在哪裏查看它。你可以做的另一件事 - 用'tail -f'打開數據庫日誌,看看發生了什麼。我不認爲這是升級問題。 – coldmind 2014-09-26 12:24:07