Слоты Django + внешний ключ сохранить молча не удается - PullRequest
0 голосов
/ 25 сентября 2018

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

...