如何从Django queryset中的ForeignKey的相关模型中获取值?

时间:2018-09-03 17:24:28

标签: django

我无法使用外键访问相关模型中的字段。

我有以下两个模型,分别是“人”和“党”:

class Person(models.Model):
    title = models.CharField(max_length = 4, blank=True, null=True)
    first = models.CharField(max_length = 30, blank=True, null=True)
    last = models.CharField(max_length = 30, blank=True, null=True)
    party = models.ForeignKey(Party, related_name = 'parties', on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        return self.id


class Party(models.Model):

    party_name = models.CharField(max_length = 50)
    party_code = models.CharField(max_length = 5)

    def __str__(self):
        return self.party_name

我正在设法增加每个聚会的人数。我希望结果看起来像这样:

[{
    "party_name": "Democrat",
    "total_members": 93
},
{
    "party_name": "Republican",
    "total_members": 32
},
{
    "party_name": "Non-Partisan",
    "total_members": 34
}]

我的序列化器如下:

class CountPartiesSerializer(serializers.ModelSerializer):

    total_members = serializers.IntegerField()

    class Meta:
        model = Person
        fields = ('id', 'party', 'total_members')

我的观点如下:

class CountPartiesViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Person.objects.values('party__party_name').annotate(total_members = Count('id'))
    serializer_class = CountPartiesSerializer

但这会导致以下结果:

[{
    "party": null,
    "total_members": 34
},
{
    "party": null,
    "total_members": 93
},
{
    "party": null,
    "total_members": 32
}]

我已经尝试了一百万种不同的方法,并且我知道我缺少了一些东西,但是我不知道该如何使它工作。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

您正在序列化错误的内容。您的序列化程序应基于Party,然后可以添加成员数。

修改

class PartySerializer(serializers.ModelSerializer):
    total_members = serializers.IntegerField()

    class Meta:
        model = Party
        fields = ('name', 'total_members')


class PartyViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Party.objects.values('name').annotate(total_members=Count('parties'))
    serializer_class = PartySerializer

您当然确实有一方与一方之间的关系:这是您的外键的反向关系。注意,您为related_name选择的名称令人困惑;它应该是“ people”,或者将其保留为默认值,即“ person_set”。