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

我正在尝试使用以下代码片段在运行时动态添加属性:


看法

...

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 = True

def is_not_used_flag(self):

  self.is_used = False

为什么它在循环中可以正常工作,但是当我尝试从实例中检索属性时它不起作用?我使用 setattr 遇到了同样的问题,appellation.is_used = True并修改了__dict__. 还有没有更好的方法来做到这一点?


牧羊人nacy
浏览 168回答 2
2回答

qq_笑_17

django 中的 Queryset API(通常)返回其他查询集,这些查询集依次通过访问数据库进行评估。通过这样做,queryset.first()您正在执行另一个数据库调用,您的属性尚未设置。如果您需要在查询集is_used之间保存此标志(保持更改),我建议您在模型上添加一个 BooleanField,或者可能找到另一种方法来执行您想要的操作,因为使用查询集 API 不会返回内存属性。

ibeautiful

如果您希望更改持续存在,则需要self.save()在设置后调用is_used,假设这is_used是Appellation模型上的一个字段。模型.pyfrom django.db import modelsclass 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在您提供的代码中按预期打印的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python