我想为另一个模型的字段设置外键。
我尝试了外键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_...
答案 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风格。您可以这样做,而不会影响表名,因为它是显式声明的。