2017-08-25 3 views
0

J'ai besoin de filtrer certains modèles dans Django et de les renvoyer par REST, mais j'ai quelques difficultés. J'ai 4 modèles connectés avec de clé étrangère comme ceci:Filtrage de clé étrangère de modèle Django

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() 

et Iam les sérialisation comme ceci:

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') 

et moi ressemble à ceci:

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

Le résultat ressemble ceci:

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

Ceci est totalement bien, mon problème est quand je veux aussi filtrer l'année de "eintrage.datum" en ajoutant: .filter(standort=standort, personen__eintrage__datum__year=2017) après Gruppe.objects. Ensuite, l'entrée avec "id": 2 est répétée 3 fois et celle avec "id": 3 n'est pas affichée du tout. comment puis-je filtrer juste l'entrée de la seconde dict imbriquée?

+0

Trouvez-vous un moyen de résoudre ce problème? J'ai le même problème. – iNikkz

Répondre

0

Pour éviter "id": 2 fois plusieurs fois, vous pouvez simplement ajouter une liste (set()) entourer le résultat du jeu de filtres, le framework django peut également traiter la liste de la même manière que queryset. Notez également que dans django orm, le hachage d'une instance de modèle est la prime_key de in db, c'est pourquoi l'ensemble peut fonctionner sur queryset. En ce qui concerne "id": 3 ne montre pas, je n'ai pas non plus d'idées que vous avez fait, peut-être deux fois mieux vérifier la db à nouveau. Un peu plus d'infos sera plus utile.