使用选定的对象集合更新Django模型

时间:2012-04-16 03:27:37

标签: python django model-view-controller web-applications model

我正在学习Django,我推荐djangobook.com

我有一个这样的模型:

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name

我填充了一些数据(如演示中所述)并尝试更新记录的特定字段的值(如上所述),这非常适用:

>>> publisher_list = Publisher.objects.all()
>>> p = publisher_list[0]
>>> p.name = u'Apress'
>>> p.save()

但是当我尝试以下(我假设相当于上面的内容)时,它不起作用。该名称未在数据库中更新。我在这里做错了什么?

>>> publisher_list = Publisher.objects.all()
>>> publisher_list[0].name = 'Apress'
>>> publisher_list[0].save()

参考:http://djangobook.com/en/2.0/chapter05/

感谢。

2 个答案:

答案 0 :(得分:2)

您的索引是多次从数据库中检索模型。在变异并保存之前将模型绑定到名称。

答案 1 :(得分:1)

根据QuerySet.__getitem__(),按项目检索(例如qs[0])不会被缓存,并且每次访问都会点击数据库,除非已经评估了查询集,因此缓存已填满:

>>> qs = User.objects.all()[:10]
>>> qs[0] is qs[0] # Similar with your issue, you modified the attribute of the first and tried to save the latter.
False
>>> len(qs) # evaluate and fill cache
10
>>> qs[0] is qs[0]
True

所以你可以

  • 关注Ignacio的回答,或只是p = Publisher.objects.all()[0]
  • 或者,在编制索引之前评估查询集。这是否更容易取决于您的代码逻辑。
相关问题