2017-08-25 132 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没有显示,我也没有你的想法,也许双倍更好再次检查数据库。多一点信息会更有帮助。