Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ForeignKey';Django queryset中的s相关模型?_Django - Fatal编程技术网

如何从ForeignKey';Django queryset中的s相关模型?

如何从ForeignKey';Django queryset中的s相关模型?,django,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, b

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

我有两种模式,个人和政党,如下所述:

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
我的视图集如下所示:

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
}]

我尝试过无数种不同的方法,我知道我遗漏了一些东西,但我不知道如何让它起作用。任何建议都将不胜感激

您序列化了错误的内容。序列化程序应基于参与方,然后可以添加成员数

编辑

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

你当然有一个党和人之间的关系:这是你的外键的反向关系。请注意,您选择的相关_名称令人困惑;它应该是“people”,或者将其保留为默认值,即“person\u set”。

谢谢!你能详细说明一下我会怎么做吗?我不确定我的PartySerializer在这种情况下会是什么样子,也不确定我将如何获得对人数的引用(因为如果有任何意义的话,PartySerializer与Person模型是没有关系的)。非常感谢-这很有效!我还在想着在Django的关系。