外键关系上的 Django UniqueConstraint 错误

问题描述 投票:0回答:1

我真的被这个问题困扰了。

我需要在我的 Django Web 应用程序中导入现有数据库。我在设置 IrmaTblcardpoc 和 IrmaTblcardstreet 之间的外部关系时遇到问题,因为我知道 mykey 和 streetid 是“复合键”。

我收到以下错误:

myapp.IrmaTblcardpoc.street:(fields.E311)“IrmaTblcardstreet.streetid”必须是唯一的,因为它由外键引用。

不幸的是,这有点高于我的工资。我做错了什么?

class IrmaTblunit(models.Model):
    mykey = models.CharField(db_column='myKey', primary_key=True, max_length=50)

    def __str__(self):
        return self.id
#...
class IrmaTblcardstreet(models.Model):
    mykey =  models.ForeignKey(IrmaTblunit, on_delete=models.CASCADE)
    streetid = models.CharField(db_column='StreetID', max_length=100)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['mykey', 'streetid'], name='unique_mykey_streetid')
        ]

    def __str__(self):
        return self.mykey + self.streetid

class IrmaTblcardpoc(models.Model):
    mykey =  models.ForeignKey(IrmaTblunit, on_delete=models.CASCADE, related_name='children')
    pocid = models.CharField(db_column='POCID', max_length=100, blank=True, null=True)  
    cardid = models.BigIntegerField(db_column='CardID', blank=True, null=True)
    streetid = models.ForeignKey(IrmaTblcardstreet, on_delete=models.CASCADE, to_field='streetid', db_column='streetid', related_name='poc_streets'

    class Meta:
        db_table = 'irma_tblCardPOC'
        constraints = [
            models.UniqueConstraint(fields=['mykey', 'streetid', 'pocid'], name='unique_mykey_pocid')
        ]

    def __str__(self):
        return self.mykey + self.pocid

python django django-models foreign-keys
1个回答
0
投票
class IrmaTblcardstreet(models.Model):
    ...
    streetid = models.CharField(db_column='StreetID', max_length=100)


class IrmaTblcardpoc(models.Model):
    ...
    streetid = models.ForeignKey(IrmaTblcardstreet, on_delete=models.CASCADE, to_field='streetid', db_column='streetid', related_name='poc_streets'

您正在尝试添加不是唯一字段的外键。如果您需要连接这些模型,请使用 to_field='pk' 甚至不使用此关键字 - Django 将使用 AutoField pk 在后台自动绑定这些模型

© www.soinside.com 2019 - 2024. All rights reserved.