【问题标题】:Updating Django model using selected collection of objects使用选定的对象集合更新 Django 模型
【发布时间】:2012-04-27 10:39:11
【问题描述】:

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

谢谢。

【问题讨论】:

  • 请注意,您所引用的 Django Book 已经严重过时了。 Django 刚刚升级到 1.4 版,它在许多重要方面(并且相差 3 年多)与本书所介绍的 Django 1.0 不同。当前的文档和教程是优秀的,所以请改用它们。
  • @PeterRowell:谢谢。会调查的。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据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]
    • 或者,在索引之前评估查询集。这是否更容易取决于您的代码逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多