我是Django的新手,有时我不清楚应在myApp的哪个.py中编写解决方案和示例。
在我的models.py中,我有一个名为Project的模型和一个名为Order的模型。在管理部分(http://127.0.0.1:8000/admin/myApp/)中,我希望用户在创建新项目时键入项目编号。每个项目可以有多个订单。我希望订单主键由它所属的项目编号加上一个连续的编号组成。用户只能更改Oder主键的连续编号部分,而不能更改订单所属的项目编号。
例如对于project_number(primary key)= 951的Project,订单主键可以是951-1、951-2等
另一个具有project_number(primary key)= 1015的项目也可以具有订单1,2等,但是它们不会与项目951的订单冲突,因为它们将被标记为1015-1、1015-2等。
注意,我需要order_number字段才能从order_project字段中获取其project_number,在用户创建订单并将其与项目关联之前,我不知道order_project的确切值。
如果我的要求无法完成,请提出一种解决方法,并明确说明应在myApp的哪个.py中编写代码。
class Project(models.Model):
project_number = models.IntegerField(unique=True,primary_key=True)
project_name = models.CharField(max_length=400)
class Order(models.Model):
order_project = models.ForeignKey("Project", on_delete=models.CASCADE,verbose_name = "Project to which this order is associated",related_name= "orders_for_project")
order_number = models.CharField(unique=True,primary_key=True,max_length = 10)
更新:
根据社区的建议,我的代码现在如下所示:
class Project(models.Model):
project_number = models.IntegerField(unique=True,primary_key=True)
project_name = models.CharField(max_length=400)
class Order(models.Model):
order_project = models.ForeignKey("Project", on_delete=models.CASCADE,verbose_name = "Project to which this order is associated",related_name= "orders_for_project")
order_number = models.IntegerField(default=1,validators=[MinValueValidator(1)])
class Meta:
#TODO capture error and present it in human readable form
constraints = [ models.UniqueConstraint(fields= ['order_project','order_number'], name = 'unique_order_id'),]
def __str__(self):
return str(self.order_project.project_number) + ("-") + str(self.order_number) + (" : ") + str(self.order_description)
我不完全理解为什么考虑到Project主键的值后无法形成我的Order主键,但这是一种解决方法
您可以保持Order的主键独立于Product的PK,只需在order_project_id
+order_number
组合上设置唯一性约束即可:
class Order(models.Model):
order_project = models.ForeignKey("Project", on_delete=models.CASCADE,verbose_name = "Project to which this order is associated",related_name= "orders_for_project")
order_number = models.IntegerField()
class Meta:
unique_together = ('order_project', 'order_number')
然后,如果要以{order_project_id}-{order_number}
格式显示订单号,则可以使用运行时中的这两个字段来生成此值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句