创建2个彼此相关的外键

时间:2010-01-12 19:54:45

标签: python django

class Product(models.Model):  

    name = models.CharField(max_length = 127)   
    description = models.TextField()   
    code = models.CharField(max_length = 127)

    def __unicode__(self):
        return self.name


class ProductLot(models.Model):

    product = models.ForeignKey(Product)
    code = models.ForeignKey(Product)
    lot_no = models.CharField(max_length = 30)
    location = models.CharField(max_length = 127)
    incoming = models.IntegerField()
    commited = models.IntegerField()
    available = models.IntegerField()
    reorder = models.IntegerField()
    created_date = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.product.name + " - " + self.lot_no

我希望代码与产品外键相关联,因此您输入的代码与产品相关。


好吧我试着获得与产品对应的代码的下拉框。例如,在In Django中,我使用ForeignKey作为使用数据库中产品的下拉框,但它们也有相应的代码编号,这些代码编号在代码框中没有显示为下拉框。我在考虑嵌入式类代码?对不起,我是这个

的新手

3 个答案:

答案 0 :(得分:3)

如果您对一个模型有两个FK,则需要提供不同的相关名称:

product = models.ForeignKey(Product, related_name='lot_product')
code = models.ForeignKey(Product, related_name='lot_code')

related_name来自django docs:

  

<强> ForeignKey.related_name

     

用于从相关对象到此对象的关系的名称。

     

有关完整说明和示例,请参阅related objects documentation

答案 1 :(得分:1)

使code成为查看product

的属性
def getCode(self):
  return self.product and self.product.code

def setCode(self, value):
  if self.product:
    self.product.code = value
    self.product.save()

code = property(getCode, setCode)

您将无法在查询中使用它,但这就是product__代码的用途。

答案 2 :(得分:0)

我认为你应该修改你的模型。现在,ProductLot的每个实例都指向两个产品。我不确定这是你想要的。

这实际上取决于代码和产品之间的关系。一些想法:

  1. 每个Product都有一个唯一的code(1:1关系):

    只需省略模型code中名为ProductLot的第二个ForeignKey。

  2. 每个Product可能有多个不同的代码,但每个code只指向一个Product(1:n关系):

    我会为您的代码添加另一个模型,例如:

    class Product(models.Model):
        name = models.CharField(max_length = 127)
        ...
    
    class ProductCode(models.Model):
        product = models.ForeignKey(Product)
        ...
    
    class ProductLot(models.Model):
        product_code = models.ForeignKey(ProductCode)
        ...
        def correspondingProductName(self):
            return self.product_code.product.name