2014-09-26 76 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