如何在课堂上设置两个外键? 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的主要内容,如果未能解决你的问题,请参考以下文章

Django中ORM外键和表的关系(Django编程-4)

Django--ORM 多表查询

django orm中的INNER JOIN

Django学习手册 - ORM 外键

python django中的orm外键级联删除

如何在表单完成期间设置外键(python/django)