Django模型外键过滤

时间:2017-08-25 16:12:42

标签: python django rest filter models

我需要在Django中过滤一些模型并通过REST返回它们,但是我遇到了一些困难。我有4个与外键相关的模型,如下所示:

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

和Iam将它们序列化如下:

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年。然后,"id": 2的条目重复3次,而"id": 3的条目根本不显示。我如何只过滤第二个嵌套字典的条目?

1 个答案:

答案 0 :(得分:0)

为了避免“id”:2次重复多次,你只需添加一个列表(set())环绕过滤器查询集结果,django restful框架也可以像查询集一样对待列表。另请注意,在django orm中,模型实例的哈希是db中的prime_key,因此这就是set可以在queryset上工作的原因。

至于“id”:3没有显示,我也没有你的想法,也许双倍更好地再次检查数据库。更多信息会更有帮助。