gpt4 book ai didi

django 按索引访问过滤器结果不会将其保存到模型中

转载 作者:行者123 更新时间:2023-12-04 04:22:58 25 4
gpt4 key购买 nike

模型:

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 不允许通过第一种方法保存值

最佳答案

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

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

你已经看到了一种解决方法。另一种方法是强制在filter 之后执行整个查询集。 , 但调用 list结果上。

关于django 按索引访问过滤器结果不会将其保存到模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11842036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com