【问题标题】:Logic on serializer fields序列化器字段的逻辑
【发布时间】:2022-11-12 15:58:06
【问题描述】:

我正在尝试解决如何运行一些逻辑以从我的序列化程序(或其他地方)中获取某些对象。

我有以下内容:

class Parent(models.Model):
    name = models.CharField(max_length=255)


class Child(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey(
        Parent, related_name='children', on_delete=models.CASCADE)


class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Exercise
        fields = (
            'id',
            'name',
        )


class ParentSerializer(serializers.ModelSerializer):
    children = ChildSerializer()

    class Meta:
        model = Exercise
        fields = (
            'id',
            'name',
            'children',
        )


class ParentViewSet(viewsets.ModelViewSet):
    serializer_class = ParentSerializer
    queryset = Parent.objects.all()


class ChildViewSet(viewsets.ModelViewSet):
    serializer_class = ChildSerializer
    queryset = Child.objects.all()

我想在parent 响应中添加一个字段:first_child 这是name 按字母顺序排列的第一个孩子(这个逻辑实际上会稍微复杂一些,例如多个字段之和的最大值) .我还将删除 children 字段以支持此 first_child 字段,因为这些字段的数量太高而无法像这样在线显示。

【问题讨论】:

  • Exercise 型号是什么?

标签: python django django-rest-framework


【解决方案1】:

您可以使用to_representation 方法

class ParentSerializer(serializers.ModelSerializer):
    children = ChildSerializer()

    def to_representation(self, instance):
        data = super().to_representation(instance=instance)
        first_child = instance.children.order_by("name").first()
        data["first_child"] = ChildSerializer(first_child, read_only=True).data if first_child else None
        return data

    class Meta:
        model = Parent # change model name
        fields = (
            'id',
            'name',
            'children',
        )

或者,使用SerializerMethodField

class ParentSerializer(serializers.ModelSerializer):
    children = ChildSerializer()
    first_child = serializers.SerializerMethodField()

    def get_first_child(self, instance):
        first_child = instance.children.order_by("name").first()
        if first_child:
             return ChildSerializer(first_child, read_only=True).data
        return None

    class Meta:
        model = Parent # Change model here
        fields = (
            'id',
            'name',
            'children',
            'first_child',
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2019-02-12
    • 2021-01-20
    • 1970-01-01
    • 2021-03-19
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多