@Rostislav_B

Как динамически менять ForeignKey у детей базовой абстрактной модели?

Есть много похожих моделей, в которых меняется ForeignKey, можно ли сделать так, чтобы не переопределять его в детях?

К примеру:
class AbstractTest(models.Model):
    @staticmethod
    def get_test_id():
        return 1

    test = models.ForeignKey(
        get_some_model(get_test_id()), # здесь передать статический метод или что-то другое, что будет меняться в детях
        null=True,
        verbose_name='test',
        on_delete=models.CASCADE
    )

    class Meta:
        abstract = True

class Test1Model(AbstractTest):
    @staticmethod
    def get_test_id():
        return 5

    class Meta:
        verbose_name = 'Test1Model'
        verbose_name_plural = 'Test1Models'


Таким способом к сожалению не работает, что нужно сделать чтобы работало? Нигде не нашел ответа, так как не знаю как правильно сформулировать вопрос, а переопределять в детях не хочу, потому что их может быть много и некоторые расширяются другими классами.

Так тоже не работает:
class AbstractTest(models.Model):
    F_MODEL = 'app.Default'

    test = models.ForeignKey(
        F_MODEL,
        null=True,
        verbose_name='test',
        on_delete=models.CASCADE
    )

    class Meta:
        abstract = True

class Test1Model(AbstractTest):
   F_MODEL = 'app.Model'
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
Astrohas
@Astrohas
Python/Django Developer
короче тут можно пойти двумя путями -
1) Сложным - через метакласс, декоратор или что-то подобное, но зачем?
2) Простым - как-то так. Других способов нет.
def UniversalForeignKey(to, **kwargs):
    return models.ForeignKey(
        to=to,
        null=True,
        verbose_name='test',
        on_delete=models.CASCADE,
        **kwargs
    )


class Test1(models.Model):

    test = UniversalForeignKey('app_model')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MAGistr_MTM
Учусь программировать
По-моему, нечто подобное реализовано в Django-Oscar

Там к модели Offer связаны Benefit
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы