我需要与外国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')