【问题标题】:update_or_create not updating/creating objectsupdate_or_create 不更新/创建对象
【发布时间】:2014-09-26 06:12:28
【问题描述】:

我发现 django 1.7 现在支持 queryset 中的 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 created,但是对象没有保存在数据库中。可能是什么问题?

更新

原来是我的错。在Model2中,我定义了save方法,没有返回super(Model2, self).save(*args, **kwargs)
这就是它没有保存对象的原因。

【问题讨论】:

  • 您如何验证对象是否已创建?
  • 来自他们的documentation created 是一个布尔值,指定是否创建了一个新对象。另外,我查看了Model2的数据库,没有添加记录。

标签: django django-models django-queryset


【解决方案1】:

也许您以错误的方式验证,因为我使用您的模型创建了项目并且一切正常。 就我而言,我正在验证该对象是使用 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

【讨论】:

  • 但是在documentation 中,它说'created' 是一个布尔值,指定是否创建了一个新对象。所以,我猜当它是 True 意味着对象被创建。我没用objects.get()查,直接查了数据库model2表。但是没有创建对象。哦..是的,我刚从1.6.5升级,这个升级跟这个有关系吗?
  • 是的,布尔值created 表示该对象已创建。正如您在第一次看到它是true,但在下一个false,所以它工作正常。我可以假设您没有更新您查看的数据库连接。您可以做的另一件事 - 使用tail -f 打开数据库日志,看看那里发生了什么。我不认为这是升级问题。
猜你喜欢
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2017-02-25
  • 2011-01-23
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多