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]、アクセスごとにDBにヒットします。

>>> 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 に答える