簡體   English   中英

Django模型外鍵過濾

[英]Django Model Foreign Key filtering

我需要在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)來過濾"eintrage.datum"Gruppe.objects 然后,將"id": 2的條目重復3次,而"id": 3的條目將完全不顯示。 如何只過濾第二個嵌套詞典的條目?

為了避免多次重復出現“ id”:2,您可以在過濾器queryset結果周圍添加一個list(set()),django restful框架也可以將列表與queryset一樣對待。 還要注意,在Django orm中,模型實例的哈希值是db中的prime_key,因此這就是集合可以在queryset上使用的原因。

至於“ id”:3沒有顯示,我也沒有你的想法,也許最好再檢查一次數據庫。 多一點信息會更有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM