我发现,当Django2.0模型具有ForeignKey和带有插槽的mixin时,.save()方法不起作用。尽管是非常特殊的情况,但仍然有点令人惊讶,因为没有任何异常,只是不保存数据。这是一个示例:
from django.db import models
class FooSlots:
__slots__ = ["bar", "value"]
class Bar(models.Model):
pass
class FooSloted(models.Model, FooSlots):
value = models.FloatField(default=0.42)
bar = models.ForeignKey(Bar,
on_delete=models.CASCADE,
related_name="foo_sloted"
)
def check_sanity(source, bar, value=0.5):
instance = source.objects.create(bar=bar)
instance.value = value
instance.save()
instance = source.objects.get(pk=instance.pk)
assert instance.value == value # Must be true!
所以
check_sanity(FooSloted,Bar.objects.first())
将引发断言错误,因为不会保存数据,但是Django本身没有例外。更令人困惑的是,万一bar不是ForeignKey,而是例如一个CharField,一切正常。同样,当未指定插槽时,也不会出现此类问题。
这种行为有解释吗?
PS。为了使该示例更虚构:我有几个类似“ Foo”的模型,它们带有指向不同“ Bar”的键,这些键在其他位置以类似的方式填充。 FooSlots用于强制执行相同的接口,并以相同的方式处理不同Foo的给定数据。