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 пытается взаимодействовать с моделями, пока он строит модели с этим вторым уровнем, ссылающимся на другую модель.
Что-то подсказывает мне, что это хак и есть лучший способ...