Django的新手,如果我在这里遗漏了一些明显的东西或做一些愚蠢的事情,请原谅我......
我有一个带有自定义 save() 扩展的 Django 模型。修剪不相关的字段和方法,看起来像这样:
class Content(models.Model):
url = models.URLField(max_length=1000)
image = models.URLField(blank=True, max_length=1000)
image_type = models.NullBooleanField(default=None)
def save(self, *args, **kwargs):
if self.url:
img, img_type = image_extractor(self.url)
print 'extractor returned: ', img_type
print 'before set: ', self.image_type
setattr(self, 'image', img)
setattr(self, 'image_type', img_type)
print 'after set: ', self.image_type
super(Content, self).save(*args, **kwargs)
print 'from query: ', Content.objects.get(url=self.url).image_type
image_extractor 函数返回一个 url 字符串和一个表示图像类型的布尔值:大于特定宽度的图像为 True,较小的图像为 False,如果找不到合适的图像,则为 None。问题是,当我查询 Content.objects 并检查 image_type 时,所有对象都返回 True 或 None。因此打印语句。带有 image_type None 或 True 的图像按预期工作,但是当 image_type 返回 False 时,会打印以下内容:
extractor returned: False
before set: None
after set: False
from query: True
如果我尝试设置 False(但如果我设置 None),对 super().save 的调用总是会将 image_type 恢复为 True。我承认,我不太了解 super() ,但是根据文档,扩展模型功能时似乎是必要的。谁能解释这里发生了什么,以及我该如何解决?
编辑:我注意到我可以通过管理页面将值更改为 False,并且它保持为 False。但我仍然需要修复 save() 方法。现在,我刚刚将布尔字段替换为整数字段并将值保存为 0 或 1,这确实有效。但我仍然想知道为什么更合适的领域没有。