Python и Django: Невозможно получить значения по умолчанию из двухуровневой глубокой связи по внешнему ключу

Я нашел этот трюк, который может быть хаком, для установки значений по умолчанию, когда поле является внешним ключом к другой базе данных:

class House(models.Model):
    name = models.CharField(max_length=100, unique=True)
    address = models.CharField(max_length=300, null=True, blank=True)

    def __str__(self):
        return name

    @classmethod
    def get_default(cls):
        return cls.objects.filter(address="5360 Wallaby Lane").first().pk

    class Meta:
        ordering = ["name"]

При создании другого класса, который ссылается на это поле, мы можем установить значение по умолчанию следующим образом:

class Neighborhood(models.Model):
    favourite_house = models.ForeignKey("civilization.House", on_delete=models.PROTECT, default=House.get_default())
    name = models.CharField(max_length=100, unique=True)

    @classmethod
    def get_default(cls):
        return cls.objects.filter(name="Upper Snootington").first().pk

Это работает нормально. Пока эта функция, ссылающаяся на второй слой, не вызывается другим полем по умолчанию для таблицы, Django не жалуется. Однако, как только я привязываю это поле по умолчанию к другой модели:

class City(models.Model):
    favourite_neighborhood = models.ForeignKey("civilization.Neighborhood", on_delete=models.PROTECT, default=Neighborhood.get_default())

Django бросает исключения "django.core.exceptions.AppRegistryNotReady: Модели еще не загружены.". Похоже, что это специфично для второго уровня поиска по умолчанию. Лучшее, что я могу предположить, это то, что Django пытается взаимодействовать с моделями, пока он строит модели с этим вторым уровнем, ссылающимся на другую модель.

Что-то подсказывает мне, что это хак и есть лучший способ...

Вернуться на верх