我在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
。
在这种情况下,我没有解决方案。我想知道你们是怎么处理的?
答案 0 :(得分:1)
您的Part
模型可以拥有PartMatch
的外键,而不是相反。
您的模型可以是Part *<-->1 PartMatch
和PartMatch 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()
将完成这项工作。