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'

以下不会将其保存到数据库中,

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()

为什么 django 不允许通过第一种方法保存值

4

2 回答 2

4

问题是每次你对查询集进行切片时,Django 都会访问数据库并创建一个实例。因此,您设置idon 的实例与您调用save()的实例不同 - 请记住,Django 实例没有标识,并且引用同一数据库行的单独对象不共享任何内容。

如果您检查数据库查询,您可以看到发生了什么:您会看到第一行(过滤器)没有执行任何查询。为第二行执行 SELECT - 但它只获得一个实例,使用 LIMIT 1。并且为第三行执行相同的 SELECT,为您提供一个全新的实例。

您已经看到了一种解决方法。另一种方法是强制整个查询集在 之后执行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 回答