如何创建一个具有非唯一ID的表,并将其作为另一个表中的外键?

时间:2017-09-17 14:04:52

标签: mysql django django-models

我在models.py中有以下表格:

class Part(models.Model):
    partno = models.CharField(max_length=50, unique=True)
    partdesc = models.CharField(max_length=50, default=None, blank=True, null=True)

class Price(models.Model):
    part = models.ForeignKey(Part, on_delete=models.CASCADE, null=True)
    supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE)
    qty = models.IntegerField(default=1)
    price = models.DecimalField(max_digits=9, decimal_places=2)
    currency = models.ForeignKey(Currency, on_delete=models.CASCADE)
    datestart = models.DateTimeField(auto_now_add=True, blank=False, null=False)

    class Meta:
        unique_together = (('supplier', 'part'),)

这是正常的。问题是我有许多部件号是他们的替代品。例如,部件1001-01,1001-01,1001也是相同的部件。不过,我的所有部分都在我的Part表中。

我需要在另一张表中匹配它们,所以我不需要分别为每个表输入价格。必须有一个唯一的密钥代表所有这三个项目。

问题:如何设置“部件号匹配表”并在我的价格表中为此表设置外键?

(休息是可选的,阅读哪些是我的意见/问题到目前为止,可能会有所帮助)

1:我试图像这样设置表格:

class PartMatch(models.Model):
    id = models.IntegerField(primary_key=True, unique=False, null=False, db_index=True)
    part = models.ForeignKey(Part, unique=False, on_delete=models.CASCADE)

我在迁移时没有收到错误,但是当我尝试为PK使用相同的ID时,它不允许我。

2:我单独离开了pk并尝试设置另一个字段来匹配部分:

class PartMatch(models.Model):
    part = models.ForeignKey(Part, on_delete=models.CASCADE)
    partmatchid = models.IntegerField(null=True, unique=False, db_index=True)

我在迁移时没有收到任何错误,但是当我尝试在我的partmatchid表中使用Price作为外键时:

partmatch = models.ForeignKey(PartMatch, to_field="partmatchid",
                                  db_column="partmatchid",
                                  on_delete=models.CASCADE)

我在迁移时遇到错误foreign key must be unique

在这种情况下,我没有解决方案。我想知道你们是怎么处理的?

1 个答案:

答案 0 :(得分:1)

您的Part模型可以拥有PartMatch的外键,而不是相反。

您的模型可以是Part *<-->1 PartMatchPartMatch 1<-->1 Price

例如:

class Price(models.Model):
     price = models.DecimalField(max_digits=9, decimal_places=2)


class PartMatch(models.Model):
    price = models.OneToOneField(Price, primary_key=True)


class Part(models.Model):
     partno = models.CharField(max_length=50, unique=True)
     partMatch = models.ForeignKey(PartMatch)

如果您希望以合理的价格获得所有零件,some_price.partmatch.part_set.all()将完成这项工作。