首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Django查询集中从ForeignKey的相关模型中获取值?

如何在Django查询集中从ForeignKey的相关模型中获取值?
EN

Stack Overflow用户
提问于 2018-09-04 01:24:28
回答 1查看 566关注 0票数 1

我在使用外键访问相关模型中的字段时遇到了问题。

我有两个模型,Person和Party,如下所示:

代码语言:javascript
复制
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

我在试着统计一下每个派对的人数。我希望结果看起来像这样:

代码语言:javascript
复制
[{
    "party_name": "Democrat",
    "total_members": 93
},
{
    "party_name": "Republican",
    "total_members": 32
},
{
    "party_name": "Non-Partisan",
    "total_members": 34
}]

我的序列化程序如下:

代码语言:javascript
复制
class CountPartiesSerializer(serializers.ModelSerializer):

    total_members = serializers.IntegerField()

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

我的观点如下:

代码语言:javascript
复制
class CountPartiesViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Person.objects.values('party__party_name').annotate(total_members = Count('id'))
    serializer_class = CountPartiesSerializer

但这会导致以下结果:

代码语言:javascript
复制
[{
    "party": null,
    "total_members": 34
},
{
    "party": null,
    "total_members": 93
},
{
    "party": null,
    "total_members": 32
}]

我尝试了一百万种不同的方法,我知道我错过了一些东西,但我不知道如何让它工作。任何建议都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2018-09-04 01:54:03

你序列化了错误的东西。您的序列化程序应该基于Party,然后您可以添加成员计数。

编辑

代码语言:javascript
复制
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

当然,您确实存在party和person之间的关系:这是您的外键的反向关系。请注意,您为那里的人员选择的名称很容易混淆;它应该是'people',或者只是将其保留为默认值,即‘related_name _related_name’。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52154090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档