Лучший способ понять мой вопрос - использовать код:
class ToDoList(TimeStampedModel):
DEFAULT_THEME = 1
name = models.CharField(max_length=32)
... # other fields
STATUS_CHOICES = (
('C', 'CREATED'),
('R', 'READY'),
('V', 'VALIDATED')
)
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='C')
Есть несколько типов пользователей
- Создатели: кто может создать ToDoList и запросить подтверждение
- Валидаторы: кто может проверять список
Теперь, когда валидатор отклоняет запрос проверки, он также должен указать причину. Это, вероятно, произойдет не более чем в 10% всех случаев, поэтому я не хочу добавлять поле rejection_reason в мою модель ToDoList.
Я знаю одно очевидное решение - создать другую модель, названную Reason, всего с одним полем char и FK для моей модели ToDo, но я хотел бы знать, есть ли лучший способ сделать это.
Не знаю, поможет ли это, но для API я использую django-rest-framework.
Спасибо.
ОБНОВЛЕНИЕ
После того, как валидатор отклоняет список, он должен указать причину, чтобы создатель мог изменить все, что не так со списком. После внесения изменений Создатель снова запрашивает подтверждение. Цикл продолжается до тех пор, пока Валидатор не примет ToDoList. В этот момент причина отказа больше не нужна, поэтому ее можно удалить.
Итак, в конце концов, причина отклонения больше не будет существовать, и я не думаю, что нормально (с точки зрения пространства БД) иметь поле, которое будет использоваться только временно.
1 ответ
Вы излишне беспокоитесь о сохранении (предположительно) небольшого количества текста вместе с вашим ToDoList
. Вот как я бы с этим справился, если бы цель состояла в том, чтобы не усложнять, а не добавлять еще одну модель.
class ToDoList(models.Model):
name = models.CharField(...)
validated_at = models.DateTimeField(..., null=True, editable=False)
rejection_reason = models.TextFiel(..., editable=False)
Запрос на validated_at__isnull=False
, чтобы получить проверенные списки задач, полностью игнорируя rejection_reason
. Запросите validated_at__isnull=True
, чтобы получить список непроверенных списков задач, и используйте rejection_reason
, чтобы показать пользователю причину. Если вы хотите сэкономить место в своей базе данных, очистите поле rejection_reason
после проверки списка дел. Вы также можете использовать filter (rejection_reason="")
, чтобы сузить списки задач до тех, у которых нет причины отклонения (например, тех, которые еще не были проверены или отклонены), или exclude
для того же, чтобы получить те, которые были отклонены.
TextField
, потому что вам не нужно беспокоиться об ограничениях длины, но CharField
может быть лучше, особенно если вы хотите спрогнозировать максимальный размер вашей базы данных.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.