我怎样才能让不对称的多人自我关系出现在Django restful响应中的双方?

2024-06-26 05:09:25 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我的模型中有两个相关的类:一个UserProfile类和models.py中的FriendInvite

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    username = models.TextField()
    friends = models.ManyToManyField('self',through='FriendInvite',
     symmetrical=False)

class FriendInvite(models.Model):
    sender = models.ForeignKey(UserProfile,related_name='fi_sender')
    invitee = models.ForeignKey(UserProfile,related_name='fi_invitee')
    status = models.IntegerField(default=0)
    def __str__(self):
        return '%s invites %s' % (self.sender.username,self.invitee.username)

serializers.py

^{pr2}$

views.py中:

from rest_framework import generics
from myapp.models import UserProfile
from myapp.serializers import UserProfileSerializer

class UserProfileList(generics.ListAPIView):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer

我生成了5个不同的用户和3个不同的朋友关系。但是,当我收到来自服务器的JSON响应时,它只包括发送邀请的用户,而不包括接收邀请的用户:

[{"id":1,"username":"U1","user":1,"friends":[5]},
{"id":2,"username":"U2","user":2,"friends":[]},
{"id":3,"username":"U3","user":3,"friends":[4]},
{"id":4,"username":"U4","user":4,"friends":[]},
{"id":5,"username":"U5","user":5,"friends":[2]}]

在本例中,U1向U5发送了invite,U3向U4发送了invite,U5向U2发送了邀请。我如何获得用户的已发送和已接收邀请的结果?在


Tags: 用户frompyimportselfidmodelsusername
1条回答
网友
1楼 · 发布于 2024-06-26 05:09:25

我目前的解决方案是在UserProfile类中定义一个方法,并使用查询来获得我想要的对象集。不过,我还是想知道有没有其他方法可以做到这一点。在

...
from itertools import chain
from django.db.models import Q

class UserProfile(models.Model):
    ...
    def get_friends_both(self):
        invitees_list = FriendInvite.objects.filter(Q(sender=self)).values('invitee')

        sender_list = FriendInvite.objects.filter(Q(invitee=self)).values('sender')
        return chain(sender_list,  invitees_list)

class UserProfileSerializer(serializers.ModelSerializer):
    friend_list = serializers.ReadOnlyField(source='get_friends_both')
    class Meta:
        model = UserProfile
        fields = ('friend_list','username','id')
        depth = 1

相关问题 更多 >