如何在课堂上设置两个外键?django orm



我需要与外国key做一个表'朋友',这些'''''''''''将用户类的实例存储 - 其中两个是为朋友提供的,一个是用户属性。(表是关系)

如何做?Onetoonefield不起作用。如果我尝试将两个键制成键,它会给我一个错误。因此,这是从用户到朋友的许多关系。

如果是不可能的,什么是设置此设置的更好方法?用户表可以与自身有一对多的关系吗?

class Friend(models.Model):
    id = models.IntegerField(primary_key=True)
    friend_id= models.ForeignKey(User, null=False)
    user_id = models.ForeignKey(User, null=False)

您可能在尝试进行迁移时可能看到了此错误:

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页面,介绍了自定义和扩展退出用户模型的最佳实践。

我的建议是创建一个新的用户类,从django的用户继承,在其中,您会从用户中创建许多朋友。

from django.contrib.auth.models import AbstractUser
from django.db.models import CharField, ManyToManyField
from django.utils.translation import ugettext_lazy as _
class User(AbstractUser):
    name = CharField(_("Name of User"), blank=True, max_length=255)
    friends = ManyToManyField('self', related_name='friends')

最新更新