0

I need to filter some Models in Django and return them trough REST, but I have some difficulties. I have 4 Models connected with Foreign key's like so:

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

and Iam serializing them like so:

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

and my view looks like this:

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

The result looks like this:

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

This is totally fine, my Problem is when i also want to filter the year of "eintrage.datum"by adding: .filter(standort=standort, personen__eintrage__datum__year=2017)afterGruppe.objects. Then the entry with "id": 2 is repeated 3 times and the one with "id": 3 isn't displayed at all. how do i filter just the entry's of the second nested dict?

1 Answers1

0

To avoid "id":2 repeated multi times, you can just add a list(set()) surround the filter queryset result, the django restful framework can also treat the list the same way as queryset. Also notice that in django orm, the hash of a model instance is the prime_key of in db, so that's why the set can work on queryset.

As for "id":3 not showing, I also have no ideas as you did, maybe double better check the db again. A little bit more info will be more helpful.

Menglong Li
  • 2,177
  • 14
  • 19