2017-08-25 129 views
0

我需要在Django中過濾一些模型並通過REST將它們返回,但是我遇到了一些困難。我有4種型號與外鍵的連接,像這樣: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() 

和蔭序列化他們像這樣:

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

,我的看法是這樣的:

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

結果看起來像這個:

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

這是完全正常的,我的問題是,當我還想過濾"eintrage.datum"的年份時加入:.filter(standort=standort, personen__eintrage__datum__year=2017)Gruppe.objects。然後重複3次"id": 2的輸入,並且根本不顯示具有"id": 3的輸入。我如何過濾第二個嵌套字典的條目?

+0

您是否找到解決此問題的方法?我有同樣的問題。 – iNikkz

回答

0

爲了避免「id」:2重複多次,您可以添加一個包含過濾器queryset結果的列表(set()),django restful框架也可以像queryset一樣處理列表。另外請注意,在django orm中,模型實例的哈希是db中的prime_key,所以這就是爲什麼該集合可以在queryset上工作的原因。至於「ID」:3沒有顯示,我也沒有你的想法,也許雙倍更好再次檢查數據庫。多一點信息會更有幫助。