Django 模型 - 表和表状态 - 如何建模?

问题描述 投票:0回答:1

我需要一些建议...

在我的 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 对象(例如“新” - 因为它可以更改,采用不同的语言等,所以我不应该像这样过滤它:
    orderStatus1 = OrderStatus.objects.get(status="New")
  2. 我也不应该像现在这样通过 id 获取它: orderStatus1 = OrderStatus.objects.get(pk=1) 因为没有保证,它在放入其他数据库时会是相同的 ID,等等..

那么应该如何建模,以便我可以以某种方式获取 STATUS_NEW ?

django database oop django-models
1个回答
0
投票

您可以使用

is_default
 [Django-doc]:
OrderStatus
添加“标志”UniqueConstraint,保证仅适用于
one

记录
from django.db.models import Q


class OrderStatus(models.Model):
    status = models.CharField(max_length=20, unique=True, verbose_name='Status')
    is_default = models.BooleanField(db_index=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=('is_default',),
                condition=Q(is_default=True),
                name='one_default_stats',
            )
        ]

然后您可以使用以下命令创建订单:

orderx = Order.objects.create(
    orderStatus=OrderStatus.objects.get(is_default=True), orderNo=i
)

我们不能保证至少有一条这样的记录。如果找不到,我们可以使用

NULL
/
None
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.