Python 如何将外键(另一个模型)上的字段用作我的模型主键值的一部分
我是Django的新手,有时我觉得不清楚我应该在myApp的哪个.py中编写解决方案和示例 在mymodels.py中,我有一个名为Project的模型和一个名为Order的模型。在admin部分()中,我希望用户在创建新项目时键入项目编号。每个项目可以有多个订单。我希望订单主键由它所属的项目编号加上一个连续编号组成。用户只能更改订单主键的连续编号部分,但不能更改订单所属的项目编号 例如,对于项目编号(主键)=951的项目,订单主键可以是951-1、951-2等 另一个project_number(主键)=1015的项目也可以有订单1、2等,但它们不会与project 951的订单冲突,因为它们将被标记为1015-1、1015-2等Python 如何将外键(另一个模型)上的字段用作我的模型主键值的一部分,python,django,django-models,foreign-keys,django-admin,Python,Django,Django Models,Foreign Keys,Django Admin,我是Django的新手,有时我觉得不清楚我应该在myApp的哪个.py中编写解决方案和示例 在mymodels.py中,我有一个名为Project的模型和一个名为Order的模型。在admin部分()中,我希望用户在创建新项目时键入项目编号。每个项目可以有多个订单。我希望订单主键由它所属的项目编号加上一个连续编号组成。用户只能更改订单主键的连续编号部分,但不能更改订单所属的项目编号 例如,对于项目编号(主键)=951的项目,订单主键可以是951-1、951-2等 另一个project_numbe
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)
我不完全理解为什么考虑到项目主键的值,无法形成我的订单主键,但这是一个变通解决方案您可以保持订单主键独立于产品主键,只需在
Order\u Project\u id
+Order\u 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\u project\u id}-{order\u number}
格式中显示订单号,您可以在运行时使用这两个字段生成此值。谢谢您的回答。请注意,我不需要创建订单位置字段。这是订单号,同时也是主键的一部分。我需要能够将order_项目合并到order_编号主键值中。如果我定义order\u number=models.IntegerField(unique=True,primary\u key=True),我仍然无法为不同的项目创建id=1的两个订单。它给了我一个错误:具有此订单号的订单已经存在。这是正确的,这就是为什么您不应该在订单号上设置unique=True
。您应该使用一个unique_together
属性。请仔细阅读我的答案。我将更新它以使用oprder\u number
而不是order\u position
尽管我确实包含了unique-together属性,但主键也保持为true。那么独特的组合是我现在的主键?如何在我的管理部分中显示{order\u project\u id}-{order\u position}?您应该使用UniqueConstraint而不是unique\u,这将被弃用。否则,GProst是正确的。只需在Order对象上创建一个显示所需内容的方法。它甚至可以是您的_; str______;(self)为什么订单的主键必须独立于产品的主键?