2016-05-12 7 views
0

Ich habe eine Django REST-Anwendung erstellt, die als Backend-API für ein iOS-Projekt dient. In meinem Objektmodell verwende ich "Subscription", um "User" -Objekte mit "Workspace" -Objekten zu verbinden. Hier ist ein Teil meines models.py vereinfacht:Wie serialisiert ich indirekte Beziehungen mit Abfragegruppen?

class User(models.Model): 
    # some property fields 

class Workspace(models.Model): 
    # some property fields 

class Subscription(models.Model): 
    # some property fields 
    user = models.ForeignKey(
     User, 
     on_delete=models.CASCADE, 
     related_name='subscriptions') 
    workspace = models.ForeignKey(
     Workspace, 
     on_delete=models.CASCADE, 
     related_name='subscriptions') 

Ich habe gebaut klassenbasierte Ansichten für die Objekte, so kann ich eine Liste der Arbeitsbereich-Objekte erhalten mit http GET von meinem iOS Frontend. Aus Gründen der Einfachheit möchte ich mehr als nur die Modellfelder einschließen, zum Beispiel in der Liste der Arbeitsbereiche, die ich für jedes Arbeitsbereichsobjekt eine Liste der abonnierten Benutzer aufnehmen möchte. Mir wurde empfohlen, SerializerMethodField() und die Abfrage-Sets für das Serialisieren des Felds zu verwenden, aber ich weiß nicht, wie die Abfragen erstellt werden. Ich habe so weit gekommen:

class WorkspaceSerializer(serializers.ModelSerializer): 
    subscribed_users = serializers.SerializerMethodField() 

    class Meta: 
     model = Workspace 
     fields = ('id', 'subscribed_users') 

    def get_users(self, workspace): 
     users = User.objects.filter(???) 
     serializer = UserSerializer(instance=users, many=True) 
     return serializer.data 

Erste Abonnements in den Arbeitsbereich bezogen ist einfach, weil sie unmittelbar verbunden sind, aber wie bekomme ich Benutzer, die auf den Arbeitsbereich in Frage abonniert?

Antwort

2

Die Syntax, nach der ich gesucht habe, war ein doppelter Unterstrich, der in DRF spanning heißt. Zum Beispiel:

def get_users(self, workspace): 
    users = User.objects.filter(subscription_set__workspace=workspace) 
    serializer = UserSerializer(instance=users, many=True) 
    return serializer.data 
Verwandte Themen