如何在课堂上设置两个外键? DJANGO ORM
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在课堂上设置两个外键? DJANGO ORM相关的知识,希望对你有一定的参考价值。
我需要使用存储User类实例的外键来创建一个表'Friend' - 其中两个用于朋友,一个用于user属性。 (表是关系)
这该怎么做? OnetoOneField不起作用。如果我尝试制作两个键,它会在终端中给我一个错误。所以这是从用户到朋友的两对多关系。
如果不可能,有什么更好的方法来设置它? User表是否与自身具有一对多关系?
class Friend(models.Model):
id = models.IntegerField(primary_key=True)
friend_id= models.ForeignKey(User, null=False)
user_id = models.ForeignKey(User, null=False)
答案
让我们看看我是否理解您的疑问,您不需要2个关系,只需一个用户,您就可以访问该关系的所有属性。例:
Friend.user_id.firstname
另一答案
您尝试进行迁移时可能已经看到此错误:
appname.Friend.friend_id: (fields.E305) Reverse query name for 'Friend.friend_id' clashes with reverse query name for 'Friend.user_id'.
HINT: Add or change a related_name argument to the definition for 'Friend.friend_id' or 'Friend.user_id'
它清楚地告诉你,你应该添加related_name
参数:
class Friend(models.Model):
friend_id = models.ManyToManyField(settings.AUTH_USER_MODEL)
user_id = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='user_id')
以下是Django docs page关于定制和扩展现有用户模型的最佳实践。
另一答案
你可以尝试这种方式,使用带有User和自动关系的继承。
class Friend(User):
friend_id = models.ForeignKey('self', null=False, on_delete=models.PROTECT)
user_id = models.ForeignKey(User, null=False, on_delete=models.PROTECT)
以上是关于如何在课堂上设置两个外键? DJANGO ORM的主要内容,如果未能解决你的问题,请参考以下文章