2017-08-25 5 views
0

Ich muss einige Modelle in Django filtern und sie durch REST zurückgeben, aber ich habe einige Schwierigkeiten. Ich habe 4 Modelle mit Fremdschlüssel in Verbindung etwa so:Django Modell Fremdschlüssel Filterung

class Standort(models.Model): 
    name = models.CharField(max_length=40) 
    farbe = models.CharField(max_length=20, default="Black") 

class Gruppe(models.Model): 
    standort = models.ForeignKey(Standort) 
    name = models.CharField(max_length=40) 

class Person(models.Model): 
    name = models.CharField(max_length=40) 
    gruppe = models.ForeignKey(Gruppe, related_name='personen') 

class Eintrag(models.Model): 
    person = models.ForeignKey(Person, related_name='eintrage') 
    typ = models.ForeignKey(Typ) 
    datum = models.DateField() 

und Iam sie wie so Serialisierung:

class EintragSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Eintrag 
     fields = ('datum', 'typ') 


class PersonenSerializer(serializers.ModelSerializer): 
    eintrage = EintragSerializer(read_only=True, many=True) 

    class Meta(object): 
     model = Person 
     fields = ('id', 'name', 'eintrage') 


class GruppenPersonenEintraegeSerializer(serializers.ModelSerializer): 
    personen = PersonenSerializer(read_only=True, many=True) 

    class Meta(object): 
     model = Gruppe 
     fields = ('id', 'name', 'personnel') 

und meiner Meinung nach sieht wie folgt aus:

class GruppenPersonenEintraege(APIView): 
    def get(self, request, standort, jahr): 
     gruppen = Gruppe.objects.filter(standort=standort) 
     serializer = GruppenPersonenEintraegeSerializer(gruppen, many=True) 
     return Response(serializer.data) 

Das Ergebnis sieht aus wie dieses:

[ 
{ 
    "id": 2, 
    "name": "2.Schicht", 
    "personen": [ 
     { 
      "id": 1, 
      "name": "Rolf der Tester", 
      "eintrage": [ 
       { 
        "datum": "2017-02-16", 
        "typ": 3 
       }, 
       { 
        "datum": "2017-02-15", 
        "typ": 3 
       }, 
       { 
        "datum": "2018-04-05", 
        "typ": 2 
       } 
      ] 
     } 
    ] 
}, 
{ 
    "id": 3, 
    "name": "Test", 
    "personen": [] 
} 
] 

Das ist völlig in Ordnung, mein Problem ist, wenn ich auch das Jahr "eintrage.datum" filtern möchte, indem ich: .filter(standort=standort, personen__eintrage__datum__year=2017) nach Gruppe.objects. Dann wird der Eintrag mit "id": 2 dreimal wiederholt und der mit "id": 3 wird überhaupt nicht angezeigt. Wie filtere ich nur die Einträge des zweiten verschachtelten Diktats?

+0

Finden Sie einen Weg, dies zu lösen? Ich habe das gleiche Problem. – iNikkz

Antwort

0

Um "id" zu vermeiden: 2 mehrmals wiederholt, können Sie nur eine Liste (set()) um das Ergebnis des Filterabfragesatzes hinzufügen, das django restful-Framework kann die Liste auch wie queryset behandeln. Beachten Sie auch, dass der Hash einer Modellinstanz in django orm der prim_key von in db ist. Aus diesem Grund kann der Satz für queryset verwendet werden.

Wie für "ID": 3 nicht angezeigt, ich habe auch keine Ideen wie Sie, vielleicht doppelt besser überprüfen Sie die db wieder. Ein bisschen mehr Info wird hilfreicher sein.