首页 > 解决方案 > 更改序列化程序以显示 foreignKey 字段的 id 和标题

问题描述

我正在使用 DRF,并且我有一个配置文件序列化程序,其中一个组字段是组模型的外键。配置文件序列化器:

class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields = ('group', ...)

型材型号:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # other fields
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

团体模型:

class Group(models.Model):
    title = models.CharField(max_length=100)

    def __str__(self):
        return self.title

组序列化器:

class GroupSerializer(serializers.ModelSerializer):

    class Meta:
        model = Group
        fields = ('title', 'id')
        extra_kwargs = {'id': {'read_only': True}}

我的 SPA 中有一条路线显示配置文件列表。我想显示每个配置文件的组标题,但这个序列化程序只为我提供组的 id,我不想创建另一个视图来获取组的 id 并给我标题。所以我搜索它,它首先是 2 解决方案,StringRelatedField即. 我更改并添加如下:read_onlySlugRelatedFieldProfileSerializerSlugRelatedField

class ProfileForAdminSerializer(serializers.ModelSerializer):
    group = serializers.SlugRelatedField(
        many=False,
        queryset=Group.objects.all(),
        slug_field='title'
    )

    class Meta:
        model = Profile
        fields = ('group', ...)

现在我可以访问配置文件组的标题,但问题是我必须创建配置文件并提供组字段的标题,但我想像以前一样创建配置文件并发送组 ID,并且还可以访问组标题而不发送另一个请求. (抱歉英语不好)

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


您是否考虑source过有关序列化程序字段的参数?

它应该是这样的

group_title = serializers.ReadOnlyField(source='group.title')

class Meta:
    ...
    fields = ('group_title', ...)

在这里检查


推荐阅读