Модели Django - Таблица и состояние таблицы - как моделировать?
Мне нужен совет...
В моем приложении на django есть модели: Заказ и Статус заказа:
class OrderStatus(models.Model):
status = models.CharField(max_length=20, verbose_name="Status")
class Order(models.Model):
orderNo = models.CharField(max_length=20, verbose_name="Order", unique=True)
orderStatus = models.ForeignKey(OrderStatus, on_delete=models.PROTECT, verbose_name="Status" )
Есть 3 статуса..: Новый, В процессе, Закончен...
В своих представлениях я часто использую код типа: (например, для создания заказа)
orderx = Order()
orderStatus1 = OrderStatus.objects.get(pk=1) # <- the problem is here...
orderx.orderStatus=orderStatus1
orderx.orderNo=i
orderx.save()
Проблема, с которой я столкнулся, заключается в следующем:
- Я не должен получать объект Status по содержимому char (например, «New» - потому что оно может измениться, быть на другом языке и т.д., поэтому я не должен фильтровать его, как:
orderStatus1 = OrderStatus.objects.get(status=«New») - Я также не должен получать его по id, как сейчас: orderStatus1 = OrderStatus.objects.get(pk=1) потому что нет никакой гарантии, что при размещении в другой базе данных это будет тот же самый ID и т.д.
Так как же это должно быть смоделировано, чтобы я мог как-то принимать STATUS_NEW?
Вы можете добавить «флаг» is_initial
к OrderStatus
, который гарантированно будет применяться только к одной записи, используя UniqueConstraint
[Django-doc]:
from django.db.models import Q
class OrderStatus(models.Model):
status = models.CharField(max_length=20, unique=True, verbose_name='Status')
is_initial = models.BooleanField(db_index=True)
class Meta:
constraints = [
models.UniqueConstraint(
fields=('is_initial',),
condition=Q(is_initial=True),
name='one_initial_status',
)
]
тогда вы создаете заказ с:
orderx = Order.objects.create(
orderStatus=OrderStatus.objects.get(is_initial=True), orderNo=i
)
Мы не можем гарантировать, что существует хотя бы одна такая запись. В случае, если мы не можем найти такую запись, вместо нее можно использовать NULL
/None
.