为了账号安全,请及时绑定邮箱和手机立即绑定

为什么属性被设置但不持久

为什么属性被设置但不持久

牧羊人nacy 2021-12-21 10:46:12
我正在尝试使用以下代码片段在运行时动态添加属性:看法...for appellation in queryset:  if appellation.id in used_id_set:    appellation.is_used_flag()    print(appellation.is_used)    # prints true as expected  else:    appellation.is_not_used_flag()  first = queryset.first()  print(first.is_used)  # prints AttributeError: 'Appellation' object has no attribute 'is_used'在模型中...def is_used_flag(self):  self.is_used = Truedef is_not_used_flag(self):  self.is_used = False为什么它在循环中可以正常工作,但是当我尝试从实例中检索属性时它不起作用?我使用 setattr 遇到了同样的问题,appellation.is_used = True并修改了__dict__. 还有没有更好的方法来做到这一点?
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

django 中的 Queryset API(通常)返回其他查询集,这些查询集依次通过访问数据库进行评估。通过这样做,queryset.first()您正在执行另一个数据库调用,您的属性尚未设置。

如果您需要在查询集is_used之间保存此标志(保持更改),我建议您在模型上添加一个 BooleanField,或者可能找到另一种方法来执行您想要的操作,因为使用查询集 API 不会返回内存属性。


查看完整回答
反对 回复 2021-12-21
?
ibeautiful

TA贡献1993条经验 获得超5个赞

如果您希望更改持续存在,则需要self.save()在设置后调用is_used,假设这is_used是Appellation模型上的一个字段。


模型.py


from django.db import models


class Appellation(models.Model):

    # ... rest of code ...


    is_used = models.BooleanField(default=False)


    def is_used_flag(self):

        self.is_used = True

        self.save()


    def is_not_used_flag(self):

        self.is_used = False

        self.save()

请注意,Django 实例仍然是 Python 对象,因此动态添加属性将以相同的方式工作,这就是它True在您提供的代码中按预期打印的原因。


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信