Django模型自相关子级

Django模型自相关子级,django,django-models,Django,Django Models,我是Django框架下开发的新手,我还没有找到一个文档或教程来指定如何将我将指定的数据设计转换为模型 作为一个过于简单的例子,我们将设计一个生产/装配链,其中一个产品可以依赖/消费X个产品进行构建 它将由以下结构表示: 这将转换为以下SQL(在SQL Server上): 但我无法确定它在Django模型中的表示形式,我尝试了以下解释: class Product(models.Model): name = models.CharField(primary_key=True, max_l

我是Django框架下开发的新手,我还没有找到一个文档或教程来指定如何将我将指定的数据设计转换为模型

作为一个过于简单的例子,我们将设计一个生产/装配链,其中一个产品可以依赖/消费X个产品进行构建

它将由以下结构表示:

这将转换为以下SQL(在SQL Server上):

但我无法确定它在Django模型中的表示形式,我尝试了以下解释:

class Product(models.Model):
    name = models.CharField(primary_key=True, max_length=60)
    
class Requirement(models.Model):
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False,
    )
    productRequired = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False,
    )
    Quantity = models.DecimalField(blank=False, max_digits=2, decimal_places=0)
但它显示了错误(在执行“makemigrations”时):


问题是:哪种型号可以满足这种结构要求?

@Ricardo Galain-我认为你需要重新命名的是依赖材料生产的产品。从我对典型供应链制造的理解来看,一个产品依赖于一种或多种材料/物品进行生产。 e、 g


这是1个产品的映射,依赖1个或多个材料/项目进行生产

如果你想让你发布的代码正常工作,试试这个

class Product(models.Model):
    name = models.CharField(primary_key=True, max_length=60)
    
class Requirement(models.Model):
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False,
        related_name='requirement'
    )
    productRequired = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False,
    )

是的,这是一个部分,我把例子简化了,省略了“原材料”,在这个简短的例子下,你的解决方案是不够的:我可以生产“汽车”,“汽车”需要4个“门”,我可以制造“门”,“门”需要2个“金属板”。我的库存有1个“门”和5个“金属板”,我可以计算出一辆“汽车”需要多少“金属板”?(以及在“大门”工作了多少小时)…@RicardoGalain-检查我的更新代码(指定“相关名称”)以避免错误,现在我必须找出如何以及为什么,并知道我的编程中发生了什么变化。如果在两天内没有更完整的答案,我将接受你的答案。在你的方案中,数量将是所需的数量。例如,如果您购买一款需要2节AAA电池的产品,它将是指向产品AAA电池和质量(2)的链接@Jean XavierRaynaud,我理解这种自相关关系,但我不理解“数量”应该在哪里,因为它是关系的属性,而不是“产品”。@Jean XavierRaynaud,什么模型可以包含这些信息,你能在回答中解释一下吗?为了解决你的错误,只需在两个字段Product或PrductRequired中的一个字段中添加一个相关的_名称,因为这两个字段都链接到Product,并且会为queryset关系生成冲突,即orm将无法解决Product.objects.filter(requirement\u product\u id=123)因为它可以是字段产品或ProductRequired这里是理解相关名称的文档:
Production.Requirement.product: (fields.E304) Reverse accessor for 'Requirement.product' clashes with reverse accessor for 'Requirement.productRequired'.
        HINT: Add or change a related_name argument to the definition for 'Requirement.product' or 'Requirement.productRequired'.
Production.Requirement.productRequired: (fields.E304) Reverse accessor for 'Requirement.productRequired' clashes with reverse accessor for 'Requirement.product'.
        HINT: Add or change a related_name argument to the definition for 'Requirement.productRequired' or 'Requirement.product'.
class Product(models.Model):
    name = models.CharField(primary_key=True, max_length=60)
  
class Material(models.Model):
    product = models.ForeignKey( Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False)
    name = models.CharField(max_length=120,null=False,blank=False)
    quantity = models.DecimalField()
class Product(models.Model):
    name = models.CharField(primary_key=True, max_length=60)
    
class Requirement(models.Model):
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False,
        related_name='requirement'
    )
    productRequired = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        blank=False,
        null=False,
    )