Установка default значения для поля модели типа ForeignKey
Здраствуйте, вот модель для иллюстрации:
class Foo(models.Model):
a = models.CharField(max_length=10)
def get_foo():
return Foo.objects.get_or_create(name='Russian',
currency_code='RUB',
is_main_currency=True,
is_active=True,
currency_icon_class='fa-rub')[0]
class Bar(models.Model):
b = models.CharField(max_length=10)
a = models.ForeignKey(Foo, default=get_foo)
Нужно назначить для поля "a" класса "Bar" значение по умолчанию в виде функции которая будет либо создавать либо получать значение по умолчанию модели Foo. Проблема в том, что при подготовке миграций, и последующем их применении - выдается ошибка что модели Foo не существует в БД. Требуется не хардкодить первичный ключ в значение default, а именно получать актуальный.
Такая схема моделей работает, если обработать исключение в методе создания/получения объекта foo. Но это выглядит костыльно:
def get_foo():
try:
return Foo.objects.get_or_create(name='Russian',
currency_code='RUB',
is_main_currency=True,
is_active=True,
currency_icon_class='fa-rub')[0]
except Exeption:
return 1
На английском stackoverflow находил похожие вопросы, но однозначного ответа кроме хардкода значения, или переопределения метода save не нашел (при переопределении метода save также возникает ряд противоречий). Подскажите,пожалуйста, может кто-нибудь сталкивался с такой ситуацией, как грамотно настроить получение default значения для поля модели ForeignKey? В реальном проекте используется абстрактный класс, но это не влияет на результат.
Ответы (1 шт):
Первый вариант - можно переопределить метод save. Если значения a - нету, мы достаём из БД (или любой вашей логикой) значение и присваиваем его.
class Bar(models.Model):
a = models.ForeignKey(Foo, blank=True)
def save(self, *args, **kwargs):
try:
self.a
except:
self.a = Foo.objects.first()
super().save(*args, **kwargs)
Второй вариант присваивать default значение.
class Bar(models.Model):
...
a = models.ForeignKey(Foo, default=1)
Третий вариант установить его сразу после записи, при условии, что у него blank = True