«Правильный» способ определения вспомогательных функций для метаклассов моделей DjangoPython

Программы на Python
Ответить
Anonymous
 «Правильный» способ определения вспомогательных функций для метаклассов моделей Django

Сообщение Anonymous »

Я пытаюсь упростить очень подробное и повторяющееся ограничение Check для модели, логику которой в настоящее время очень сложно анализировать, выделив и правильно переименовав повторяющиеся части.
По сути, я хочу включить это (упрощенный и абстрактный фрагмент):

Код: Выделить всё

class MyModel(models.Model):
class Meta:
constraints = [
models.CheckConstraint(
check = (
(
models.Q(foo = True)
& (
(
models.Q(field1 = 'X')
& models.Q(field2 = 'Y')
& models.Q(field3 = 'Z')
)
|
(
models.Q(field4 = 1)
& models.Q(field5 = 2)
& models.Q(field6 = 3)
)
)
)
|
(
models.Q(foo = False)
& (
(
models.Q(field1 = 'X')
& models.Q(field2 = 'Y')
& models.Q(field3 = 'Z')
)
|
(
models.Q(field4 = 4)
& models.Q(field5 = 5)
& models.Q(field6 = 6)
)
)
)
),
name = 'foo',
),
]
В этом:

Код: Выделить всё

class MyModel(models.Model):
class Meta:
constraints = [
models.CheckConstraint(
check = (
(
models.Q(foo = True)
& (
condition1
|
condition2
)
)
|
(
models.Q(foo = False)
& (
condition1
|
condition3
)
)
),
name = 'foo',
),
]
Что я пробовал/думал попробовать:
  • Выделение условий, как атрибутов, так и методов в Сама Мета; это не сработало: TypeError: 'class Meta' получил недопустимые атрибуты: условие1, условие2, условие3;
  • Выделение условия как атрибуты и методы в MyModel; это, конечно, не сработает, поскольку вы не можете напрямую ссылаться на MyModel изнутри Meta;
  • Учет условий как атрибуты в корне models.py (следовательно, вне Meta и MyModel); это сработало; однако при этом условия остаются слабо связанными с MyModel и ее Meta, что в данном случае нежелательно, поскольку эти условия строго привязаны к обоим и не в любом случае предназначено для повторного использования где угодно.
Поэтому, хотя проблема была решена простым помещением условий в другое место, мне было интересно: является есть элегантный способ сделать то же самое, но сохраняя строгую связь между условиями и MyModel или ее мета классом?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ta-classes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»