Django插槽+外键保存无提示失败

时间:2018-09-25 10:06:46

标签: django python-3.x django-models save

我发现,当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的给定数据。

0 个答案:

没有答案