gpt4 book ai didi

python - Django - NullBooleanField 不会保留自定义 save() 方法中的 False 值

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:48 25 4
gpt4 key购买 nike

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 字符串和一个表示图像类型的 bool 值:对于大于特定宽度的图像,返回 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() 方法。现在,我刚刚用整数字段替换了 bool 字段,并将值保存为 0 或 1,这确实有效。但我仍然想知道为什么更合适的字段没有。

最佳答案

自从写下这个问题后,我就开始使用 IntegerField 将 bool 值存储为 0 或 1 的临时解决方案。在决定今晚重新审视该问题并切换回 NullBooleanField 后,突然一切都按预期进行。所以看起来 danodonovan 是正确的:上面的代码是正确的,不幸的是我仍然不知道是什么导致了错误。我在使用 IntegerField 时更改的其他内容一定已经解决了该问题。感谢那些看过并提供一些意见的人,很抱歉浪费了您的时间。

关于python - Django - NullBooleanField 不会保留自定义 save() 方法中的 False 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291315/

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