2016-06-29 23 views
0

Ich habe derzeit zwei relevante Klassen in meinem Modell: Eine UserProfile Klasse und eine FriendInvite Klasse in models.pyWie kann ich eine asymmetrische Viele-zu-Viele-Selbstbeziehung für beide Parteien in einer Django-Ruheantwort bekommen?

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) 

In serializers.py:

from rest_framework import serializers 
from myapp.models import UserProfile 

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

Und in 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 

I generierte 5 verschiedene Benutzer und 3 verschiedene Freundschaftsbeziehungen. Allerdings, wenn ich die JSON-Antwort vom Server empfangen, nur es die Benutzer enthalten, die die Einladungen verschickt, nicht diejenigen, die sie erhalten haben:

[{"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]}] 

In diesem Fall U1 gesendet ein bis U5, U3 bis U4 laden und U5 bis U2. Wie kann ich Ergebnisse für sowohl gesendete als auch empfangene Einladungen für Nutzer erhalten?

+0

Warum haben Sie 'symmetric = False' in' friends' M2M Field gesetzt? Wenn U1 ein Freund von U5 ist, wird U5 dann kein Freund von U1 sein? –

+0

Django ließ mich keine symmetrische Beziehung mit einem Through-Argument/Beziehung für die Modelle definieren. –

Antwort

0

Meine aktuelle Lösung besteht darin, eine Methode in der UserProfile Klasse zu definieren und Abfragen zu verwenden, um die Menge der Objekte zu erhalten, die ich möchte. Ich möchte immer noch wissen, ob es andere Möglichkeiten gibt, dies zu tun.

... 
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