Skip to main content
 首页 » 编程设计

python之Django,使用自定义用户模型添加 friend

2024年08月22日29mfrbuaa

我知道我在这里重新发明轮子,但我就是不喜欢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 .这篇文章帮助我了解我做错了什么以及应该改变什么。