Django: ссылка на унаследованные атрибуты из миксина - PullRequest
0 голосов
/ 20 июня 2020

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

Вот что существует в настоящее время:

class MyModel(models.Model):
    COLD = 1
    WARM = 2
    HOT = 3
    FIRE = 4

    STATUSES = (
        (COLD, 'Cold'),
        (WARM, 'Warm'),
        (HOT, 'Hot'),
        (FIRE, 'Fire'),
    )

   status = models.IntegerField(choices=STATUSES)

Вот что я хотел бы сделать:

class StatusMixin:
    COLD = 1
    WARM = 2
    HOT = 3
    FIRE = 4

    STATUSES = (
        (COLD, 'Cold'),
        (WARM, 'Warm'),
        (HOT, 'Hot'),
        (FIRE, 'Fire'),
    )

class MyModel(StatusMixin, models.Model):
    status = models.IntegerField(choices=STATUSES)

Я пытаюсь сослаться на них:

  1. В рамках наследующей им модели:
my_model_instance = MyModel.objects.get(id=1)
if my_model_instance.status == MyModel.FIRE:
    return
Как часть модели, НЕ наследующей их, но ссылающейся на модель, которая наследует:
class OtherModel(models.Model):
    my_model_status = models.IntegerField(choices=MyModel.STATUSES)

Я не могу удовлетворить оба условия. Я уверен, что есть способ получше - может, не миксин?

1 Ответ

0 голосов
/ 20 июня 2020

Если вы напишете его следующим образом, оба ваших условия будут работать:

class StatusMixin:
    COLD = 1
    WARM = 2
    HOT = 3
    FIRE = 4

    STATUSES = (
        (COLD, 'Cold'),
        (WARM, 'Warm'),
        (HOT, 'Hot'),
        (FIRE, 'Fire'),
    )

class MyModel(models.Model, StatusMixin):
    status = models.IntegerField(choices=StatusMixin.STATUSES)

class OtherModel(models.Model):
    my_model_status = models.IntegerField(choices=MyModel.STATUSES)

Однако я бы рекомендовал вам также использовать StatusMixin на OtherModel:

class OtherModel(models.Model, StatusMixin):
    my_model_status = models.IntegerField(choices=StatusMixin.STATUSES)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...