0

我正在学习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/

谢谢。

4

2 回答 2

2

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

于 2012-04-16T03:29:54.117 回答
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

所以你可以

  • 按照伊格纳西奥的回答,或者只是p = Publisher.objects.all()[0]
  • 或者,在索引之前评估查询集。这是否更容易取决于您的代码逻辑。
于 2012-04-16T07:19:21.447 回答