django-models - 如何修复“Follow.s_id”不是“用户”的外键。”在这个模型中
问题描述
我是 Django 框架的新手,我正在尝试构建以下系统,其中包含关注多个股票的用户并且股票被多个人关注,我正在尝试使用中间类创建复合键,但我有这个错误。
class Stock(models.Model):
symbol = models.CharField(max_length=12, primary_key=True,default="")
name = models.CharField(max_length=64)
top_rank = models.IntegerField(null=True)
price = models.FloatField()
change = models.FloatField(null=True)
change_percent = models.FloatField()
market_cap = models.FloatField(null=True)
primary_exchange = models.CharField(null=True, max_length=32) # NASDAQ
followers = models.ManyToManyField('myapp.Users',through='Follow',through_fields=('u_id','s_id'))
class Users(models.Model):
user_id = models.IntegerField(primary_key=True,default="")
name = models.CharField(max_length=12)
class Follow(models.Model):
u_id=models.ForeignKey('Users',on_delete=models.CASCADE)
s_id=models.ForeignKey('Stock',on_delete=models.CASCADE)
myapp.Stock.followers: (fields.E339) 'Follow.s_id' is not a foreign key to 'Users'.
HINT: Did you mean one of the following foreign keys to 'Users': u_id?
myapp.Stock.followers: (fields.E339) 'Follow.u_id' is not a foreign key to 'Stock'.
HINT: Did you mean one of the following foreign keys to 'Stock': s_id?
解决方案
through_fields
[Django-doc]的顺序不正确。如文档中所述:
through_fields
接受一个 2-tuple('field1', 'field2')
,其中是定义在(...)上field1
的模型的外键名称,以及ManyToManyField
目标模型(...)field2
的外键名称。
所以这意味着 的第一项through_fields
应该在's_id'
这里,因为它指的是Stock
模型,您定义 的模型,ManyToManyField
第二项应该是'u_id'
:
class Stock(models.Model):
# …
followers = models.ManyToManyField(
'myapp.Users',
through='Follow',
through_fields=('s_id','u_id')
)
话虽如此,您无需在through_fields
此处定义,因为您的Follow
模型恰好包含两个ForeignKey
指向不同模型的 s。事实上,您也不需要定义through=...
模型,因为它不包含任何额外的字段。
请注意,通常 aForeignKey
不包含后缀,因为 Django会_id
自动添加一个额外的字段,其_id
后缀包含引用值的主键。
因此,将模型定义为:
class Stock(models.Model):
symbol = models.CharField(max_length=12, primary_key=True)
name = models.CharField(max_length=64)
top_rank = models.IntegerField(null=True)
price = models.FloatField()
change = models.FloatField(null=True)
change_percent = models.FloatField()
market_cap = models.FloatField(null=True)
primary_exchange = models.CharField(null=True, max_length=32) # NASDAQ
followers = models.ManyToManyField('myapp.User')
class User(models.Model):
user_id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=12)
请注意,模型通常有一个单数名称,所以User
,而不是。Users
推荐阅读
- html - html 表:是否可以为不存在的单元格设置样式,还是必须将它们添加到代码中?
- c++ - (c++) 如何在主函数中连续使用类的方法?
- apache - ajp_msg_append_cvt_string(): Apache 2.4 上的 BufferOverflowException
- angular - e-altrow 变更单 angular ejs
- android - 无法解析“NetworkChangeListener”中的方法“getSupportFragmentManager”
- amazon-dynamodb - 如何立即从 DynamoDB 中删除元素?
- sql-server - 在 PowerShell 中将大型 blob 从 SQL Server 提取到文件需要很长时间
- jasper-reports - 在 Jasper 报告中设置详细信息带或框架元素以填充整个页面
- html - 仅限 CSS FLEXBOX - 顶部 2 个元素,底部 1 个元素。(非结构化)
- java - 如何通过 2 个动作对休息请求进行异常处理?