Установка 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 шт):

Автор решения: Andrew Holovko

Первый вариант - можно переопределить метод 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

→ Ссылка