簡體   English   中英

如何從Django queryset中的ForeignKey的相關模型中獲取值?

[英]How to get values from ForeignKey's related model in Django queryset?

我在使用外鍵訪問相關模型中的字段時遇到問題。

我有以下兩個模型,“人”和“聚會”:

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

我已經嘗試了上百萬種不同的方法,但我知道我缺少某些東西,但是我不知道如何使它起作用。 任何建議將不勝感激!

您正在序列化錯誤的內容。 您的序列化器應基於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”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM