【问题标题】:How do I return a count of linked objects in a GenericRelation field in a DRF Serializer?如何在 DRF 序列化程序的 GenericRelation 字段中返回链接对象的计数?
【发布时间】:2019-05-25 20:57:08
【问题描述】:

在 Django Rest Framework 中有很多关于 serializing GenericRelations 的问题,但是我有一个用例,我只想简单地返回 GenericRelation 字段中的对象计数,而不是序列化它们。我能找到的文档和现有问题并未涵盖这一点。

我认为这可能就像在自定义序列化器中返回 len(value) 一样简单,但这会产生以下抛出:

object of type 'GenericRelatedObjectManager' has no len()

我的失败尝试:

class ObjectCountSerializer(serializers.RelatedField):
    """
    Return the count of related objects.
    """

    def to_representation(self, value):
        return len(value)

class PostListSerializer(serializers.ModelSerializer):
    """
    Main serializers for the writings module
    """
    author = MemberListSerializer(many=False, read_only=True)
    comments = ObjectCountSerializer(read_only=True)

    class Meta:
        model = Post
        fields = (
            'id',
            'slug',
            'url',
            'title',
            'description',
            'created',
            'edited',
            'author',
            'comments'
        )
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

我如何简单地返回关系中的对象数?

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    我会说SerializerMethodField 可以解决这个问题,例如

    class PostListSerializer(serializers.ModelSerializer):
        """
        Main serializers for the writings module
        """
        author = MemberListSerializer(many=False, read_only=True)
        comments = serializers.SerializerMethodField()
    
        def get_comments(self, instance):
            return instance.comments.count()
    
        class Meta:
            model = Post
            fields = (
                'id',
                'slug',
                'url',
                'title',
                'description',
                'created',
                'edited',
                'author',
                'comments'
            )
            lookup_field = 'slug'
            extra_kwargs = {
                'url': {'lookup_field': 'slug'}
            }
    

    SerializerMethodField是一个只读字段,返回方法的结果,一般命名为get_<field_name>

    【讨论】:

    • 宾果邦戈邦戈,就是这样。干杯队友,感谢您的帮助。
    • 哈哈,听起来很澳大利亚。很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2019-02-20
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多