外国字段如何显示名称而不是其ID?

qg_*_*137 4 python django django-rest-framework

在我的models.py中,有两个模型,AvailableArea有一个外部字段参考AddressRegion:

class AddressRegion(models.Model):
    name = models.CharField(max_length=8)

    def __str__(self):
        return self.name
    def __unicode__(self):
        return self.name


class AvailableArea(models.Model):
    name = models.CharField(max_length=8)
    addressregion = models.ForeignKey(AddressRegion, default=1, related_name='availableareas', on_delete=models.CASCADE)

    def __str__(self):
        return self.name
    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

在serializers.py中,我序列化了所有字段:

class AvailableAreaSerializer(ModelSerializer):
    """
    ????
    """
    class Meta:
        model = AvailableArea
        fields = "__all__"
Run Code Online (Sandbox Code Playgroud)

在views.py中:

class AddressRegionListAPIView(ListAPIView):
    serializer_class = AddressRegionSerializer
    permission_classes = []
    queryset = AddressRegion.objects.all()
Run Code Online (Sandbox Code Playgroud)

其余的框架数据是这样的:

[
    {
        "id": 13,
        "name": "????",
        "addressregion": 3
    },
    {
        "id": 14,
        "name": "????",
        "addressregion": 4
    },
    {
        "id": 15,
        "name": "????",
        "addressregion": 3
    }
]
Run Code Online (Sandbox Code Playgroud)

我希望addressregion不显示地址区域id,但显示地址区域name.

Dan*_*iel 6

你可以做

class AvailableAreaSerializer(ModelSerializer):

    addressregion_name= serializers.ReadOnlyField(source='addressregion.name')

    class Meta:
        model = AvailableArea
        fields = ('id', 'name', 'addressregion_name')
Run Code Online (Sandbox Code Playgroud)


小智 6

只需在序列化器中添加以下代码:

addressregion_name = serializers.StringRelatedField()
Run Code Online (Sandbox Code Playgroud)

#应该像下面这样

class AvailableAreaSerializer(ModelSerializer):

addressregion_name = serializers.StringRelatedField()

class Meta:
    model = AvailableArea
    fields = ('id', 'name', 'addressregion__name')
Run Code Online (Sandbox Code Playgroud)