Я обнаружил, что когда модель Django2.0 имеет ForeignKey и миксин со слотами, метод .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.