【问题标题】:Django Model Foreign Key filteringDjango 模型外键过滤
【发布时间】:2018-02-03 17:58:02
【问题描述】:

我需要在 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()

我正在像这样对它们进行序列化:

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

【问题讨论】:

  • 你有什么办法解决这个问题吗?我也有同样的问题。

标签: python django rest filter models


【解决方案1】:

为了避免 "id":2 重复多次,你可以在过滤器查询集结果周围添加一个列表(set()),django restful 框架也可以将列表视为查询集。另请注意,在 django orm 中,模型实例的哈希是 db 中的 prime_key,所以这就是集合可以在 queryset 上工作的原因。

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

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2018-03-19
    • 2013-09-23
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多