2016-06-29 71 views
0

我現在有在我的模型2相關的類:一UserProfile類和FriendInvitemodels.py如何在Django寧靜的響應中獲得不對稱的多對多自我關係以顯示雙方?

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

from rest_framework import serializers 
from myapp.models import UserProfile 

class UserProfileSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = UserProfile 

而且在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,U3到U4和U5到U2。我怎樣才能爲用戶發送和接收邀請的結果?

+0

你爲什麼要在'friends' M2M字段中設置'symmetrical = False'? 如果U1是U5的朋友,那麼U5不會是U1的朋友嗎? –

+0

Django不會讓我通過模型的'through'參數/關係來定義對稱關係。 –

回答

0

我目前的解決方案是在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 
相關問題