3

モデル:

class faqs(models.Model):
 id = models.AutoField(primary_key=True)
 question=models.TextField()
 answer=models.TextField()
 category=models.CharField(max_length=200,null=True)
 frequency=models.IntegerField(max_length=10, blank = True, null = True)
 class Meta:
    db_table='faqs'

以下はDBに保存しませんが、

s=faqs.objects.filter(id=1)
s[0].id=111
s[0].save()

しかし、これは更新された値をDBに保存し、

s=faqs.objects.filter(id=1)[0]
s.id=111
s.save()

ジャンゴが最初の方法で値を保存できないのはなぜですか

4

2 に答える 2

4

問題は、クエリセットをスライスするたびに、Django がデータベースにアクセスして新しいインスタンスを作成することです。したがって、設定したインスタンスidは呼び出したインスタンスと同じではありませsave()ん。Django インスタンスには ID がなく、同じデータベース行を参照する個別のオブジェクトは何も共有しないことに注意してください。

データベース クエリを調べると、何が起こっているかがわかります。最初の行であるフィルターに対してクエリが実行されていないことがわかります。2 行目で SELECT が実行されますが、LIMIT 1 を使用して 1 つのインスタンスしか取得されません。3 行目でも同じ SELECT が実行され、まったく新しいインスタンスが作成されます。

あなたはすでにこれを一周する方法を見てきました。もう 1 つの方法は、クエリセット全体を の後に強制的に実行することですが、結果filterを呼び出します。list

于 2012-08-07T09:30:12.390 に答える
-1

QuerySetが遅延しているために可能です。つまり、クエリセットからアイテムにアクセスしても、それはqueryset item モデルの実際のインスタンスではないため、クエリセットは更新されません。

修理:

s = faqs.objects.filter(id=1)
obj = s[0]
obj.id=111
obj.save()    
于 2012-08-07T08:53:11.807 に答える