Модели 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()

Проблема, с которой я столкнулся, заключается в следующем:

  1. Я не должен получать объект Status по содержимому char (например, «New» - потому что оно может измениться, быть на другом языке и т.д., поэтому я не должен фильтровать его, как:
    orderStatus1 = OrderStatus.objects.get(status=«New»)
  2. Я также не должен получать его по 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.

Вернуться на верх