django通过索引访问筛选结果不会将其保存到模型中

django通过索引访问筛选结果不会将其保存到模型中,django,django-models,Django,Django Models,型号: 下面的内容不会保存到DB中 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 = Tr

型号:

下面的内容不会保存到DB中

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'
但这会将upadted值保存到DB

s=faqs.objects.filter(id=1)
s[0].id=111
s[0].save()
为什么django不允许通过第一种方法保存值,因为。这意味着当您从queryset访问一个项目而不启动它时,它不会更新queryset,因为它是
queryset项目
不是模型的真实实例

修正:


问题是,每次分割queryset时,Django都会命中数据库并创建一个新实例。因此,设置
id
的实例与调用
save()
的实例不同-请记住,Django实例没有标识,引用同一数据库行的单独对象不会共享任何内容

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


你已经看到了解决这个问题的方法。另一种方法是强制在
过滤器
之后执行整个查询集,但对结果调用
列表

不完全如此。这是一个模型的完美真实实例,但每次都会得到一个新实例。请看我的答案。我知道查询集求值是懒惰的…但仍然不清楚。为什么访问列表不会保存到DB?为什么类型(s[0])和类型(s)会给出相同的结果?对于第一个问题,我不知道如何才能更清楚。将queryset切片,得到一个实例,对其进行修改,然后将其丢弃。然后获得一个新实例并保存它:但该实例没有更改。关于你的第二个问题,他们没有。
s=faqs.objects.filter(id=1)[0]
s.id=111
s.save()
s = faqs.objects.filter(id=1)
obj = s[0]
obj.id=111
obj.save()