Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将外键(另一个模型)上的字段用作我的模型主键值的一部分_Python_Django_Django Models_Foreign Keys_Django Admin - Fatal编程技术网

Python 如何将外键(另一个模型)上的字段用作我的模型主键值的一部分

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

我是Django的新手,有时我觉得不清楚我应该在myApp的哪个.py中编写解决方案和示例

在mymodels.py中,我有一个名为Project的模型和一个名为Order的模型。在admin部分()中,我希望用户在创建新项目时键入项目编号。每个项目可以有多个订单。我希望订单主键由它所属的项目编号加上一个连续编号组成。用户只能更改订单主键的连续编号部分,但不能更改订单所属的项目编号

例如,对于项目编号(主键)=951的项目,订单主键可以是951-1、951-2等

另一个project_number(主键)=1015的项目也可以有订单1、2等,但它们不会与project 951的订单冲突,因为它们将被标记为1015-1、1015-2等

  • 是否可以在models.py中实现这一点
  • 如何修改下面的订单号字段
  • 请注意,我需要order\u number字段从order\u项目字段获取其项目编号,在用户创建订单并将其与项目关联之前,我不知道order\u项目的确切值

    如果我所要求的无法实现,请建议一种解决方法,并清楚地解释我应该在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) 
    

    我不完全理解为什么考虑到项目主键的值,无法形成我的订单主键,但这是一个变通解决方案

    您可以保持订单主键独立于产品主键,只需在
    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)为什么订单的主键必须独立于产品的主键?