我知道我在这里重新发明轮子,但我就是不喜欢django-friendship,想自己写。
因此,我有自定义用户模型 Person
class Person(AbstractBaseUser, PermissionsMixin):
username = models.CharField(('username'), max_length=75, unique=True,
help_text=('Required. 30 characters or fewer. Letters, numbers and '
'@/./+/-/_ characters'),
validators=[
validators.RegexValidator(re.compile('^[\w.@+-]+$'),
('Enter a valid username.'), 'invalid')
])
....more other fields....
friend = models.ForeignKey('self', related_name="friends", default=None, null=True)
如您所见,我有外键与 self 或其他词的 oneToMany 关系。
这是我在 views.py 中用来添加 friend 的内容
def add_friend(request, username):
if request.user.is_authenticated():
user = Person.objects.get_by_natural_key(username)
if user is not None:
user.friend = request.user /// here
return HttpResponseRedirect('/profile/')
我正在获取要通过用户名添加到我的 friend 的用户,并将用户字段( friend )设置为当前用户(请求用户)。但是,我认为我在这里做错了什么。
我试着用谷歌搜索它,但没有找到 ForeignKey('self') 的例子
请您参考如下方法:
最后我用另一种方式做了
我使用 ManyToMany 和类 Relationship 而不是 ForeignKey
class Person(AbstractBaseUser, PermissionsMixin):
... things here...
relationships = models.ManyToManyField('self', through='Relationship',
symmetrical=False,
related_name='related_to')
和类
class Relationship(models.Model):
from_person = models.ForeignKey(Person, related_name='from_people')
to_person = models.ForeignKey(Person, related_name='to_people')
要在我的 View 中添加用户,我有这个
def add_friend(request, username):
if request.user.is_authenticated():
user = Person.objects.get_by_natural_key(username)
Relationship.objects.get_or_create(
from_person=request.user,
to_person=user)
return HttpResponseRedirect('/profile/')
并显示用户列表
def show_friends(request, username):
user = Person.objects.get_by_natural_key(username)
rel = user.relationships.filter(
to_people__from_person=user)
args = {'friends': rel}
return render(request, "profile/friend_list.html", args)
可以看到更多here .这篇文章帮助我了解我做错了什么以及应该改变什么。
