如何将外键设置为其他模型的字段?

时间:2019-07-05 08:33:54

标签: django django-rest-framework

我想为另一个模型的字段设置外键。

我尝试了外键to_field ='field_name'

class Banks(models.Model):
    name = models.TextField()
    id = models.IntegerField(unique=True)

    class Meta:
        db_table = 'banks'

class Branches(models.Model):
    ifsc = models.CharField(max_length=20, null=False)
    bank_id = models.ForeignKey(Banks, to_field='id', on_delete=models.CASCADE)
    branch = models.CharField(max_length=50)```

ProgrammingError: column branches.id does not exist
LINE 1: SELECT "branches"."id", "branches"."ifsc", "branches"."bank_...

2 个答案:

答案 0 :(得分:1)

只需在 Banks 模型中的 name 列中添加 unique=True 即可。

class Banks(models.Model):
    name = models.TextField(unique=True) # Just add unique=True
    id = models.IntegerField(unique=True, primary_key=True)

    class Meta:
        db_table = 'banks'

class Branches(models.Model):
    ifsc = models.CharField(max_length=20, null=False)
    bank_id = models.ForeignKey(Banks, to_field='id', on_delete=models.CASCADE) # Now it will work
    branch = models.CharField(max_length=50)

答案 1 :(得分:0)

此问题不是由外键引起的。该错误发生在Branches模型中,该模型大概也具有db_table Meta属性,并且基于旧表。

必须定义模型的主键。如果您不这样做,则Django会自动这样做,并将其命名为id。对于您的银行模型,应将id字段设置为primary_key=True-或实际上将其完全删除,因为这是默认设置。您还需要为分支机构找到合适的pk,并在字段中进行声明。

对于您的实际问题,您无需执行任何操作; Django会自动将FK设置为​​指向目标模型的PK。

class Bank(models.Model):
    # removed `id` as that is the default PK
    name = models.TextField()

    class Meta:
        db_table = 'banks'

class Branch(models.Model):
    ifsc = models.CharField(max_length=20, primary_key=True)  # assume this is the PK
    bank = models.ForeignKey(Bank, on_delete=models.CASCADE)
    branch = models.CharField(max_length=50)

    class Meta:
        db_table = 'branches'

还请注意,由于这些是旧表,您可能要向两个Meta类添加managed = False。正如AKX所建议的那样,将模型名称设为单数是Django风格。您可以这样做,而不会影响表名,因为它是显式声明的。