Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django Rest框架中修改序列化程序的输出_Python_Django_Django Rest Framework - Fatal编程技术网

Python 在Django Rest框架中修改序列化程序的输出

Python 在Django Rest框架中修改序列化程序的输出,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用django rest框架输出一篇文章的内容。它工作得非常出色,除了现在我想修改行为,不返回完整的“内容”,而是一个挑逗(比如内容的前200个字符,但理想情况下,我希望能够添加任何逻辑,比如200个字符后的第一句话的结尾): 我看了GenericAPIView,我认为可能有一些东西需要覆盖——但没有什么看起来很明显——有人能提供一些见解吗?提前谢谢你我接受马里奥德夫的解决方案,因为它确实有效,我最初的想法也是如此。我确实扩展了我的需求,并希望将摘要功能应用到其他领域,因此我最终得到:

我正在使用django rest框架输出一篇文章的内容。它工作得非常出色,除了现在我想修改行为,不返回完整的“内容”,而是一个挑逗(比如内容的前200个字符,但理想情况下,我希望能够添加任何逻辑,比如200个字符后的第一句话的结尾):


我看了GenericAPIView,我认为可能有一些东西需要覆盖——但没有什么看起来很明显——有人能提供一些见解吗?提前谢谢你

我接受马里奥德夫的解决方案,因为它确实有效,我最初的想法也是如此。我确实扩展了我的需求,并希望将摘要功能应用到其他领域,因此我最终得到:

from django import forms
from rest_framework.compat import force_text
from rest_framework import serializers, fields

class TeaserField(fields.Field):

    def __init__(self, teaser_length=None, original_field=None):
        self.teaser_length = teaser_length
        self.original_field = original_field
        super(fields.Field, self).__init__()

    def field_to_native(self, obj, field_name):
        if(self.original_field != None):
            field_name = self.original_field

        value = getattr(obj, field_name)
        return self.to_native(value)

    def to_native(self, value):
        def joinEm(chunk):
            teaser = ''
            i=0
            while len(teaser) < self.teaser_length:
                teaser += chunk[i] + '.'
                i += 1

            return teaser

        chunk = value.split('.')
        teaser = joinEm(chunk)

        strongOpenTag = '<strong>'
        strongOpen = teaser.find(strongOpenTag)
        strongClose = teaser.find('</strong>')

        if(strongOpen > 0 and strongClose < 0):
            teaser  = teaser.replace(strongOpenTag,'')

        return force_text(teaser)

我很确定这就是你需要的:


如果您希望“内容”是一个可写字段,也可以输入完整的内容,但只输出摘要内容,那么这是一种明智的方法。如果您只需要一个只读字段,请使用另一个答案中提到的
SerializerMethodField
。我正在旅行,但在着陆时会看到这个字段。它似乎更符合我的要求——一种更简单的方法。默认情况下,DRF查找方法
get{serializer\u method\u field\u name}
,在本例中是trister。如果要使用自定义方法名,则可以将方法名传递给SerializermethodField。如果我错了,请纠正我。
from django import forms
from rest_framework.compat import force_text
from rest_framework import serializers, fields

class TeaserField(fields.Field):

    def __init__(self, teaser_length=None, original_field=None):
        self.teaser_length = teaser_length
        self.original_field = original_field
        super(fields.Field, self).__init__()

    def field_to_native(self, obj, field_name):
        if(self.original_field != None):
            field_name = self.original_field

        value = getattr(obj, field_name)
        return self.to_native(value)

    def to_native(self, value):
        def joinEm(chunk):
            teaser = ''
            i=0
            while len(teaser) < self.teaser_length:
                teaser += chunk[i] + '.'
                i += 1

            return teaser

        chunk = value.split('.')
        teaser = joinEm(chunk)

        strongOpenTag = '<strong>'
        strongOpen = teaser.find(strongOpenTag)
        strongClose = teaser.find('</strong>')

        if(strongOpen > 0 and strongClose < 0):
            teaser  = teaser.replace(strongOpenTag,'')

        return force_text(teaser)
from django import forms
from rest_framework.compat import force_text

class TeaserField(fields.CharField):
    def __init__(self, teaser_length=None, *args, **kwargs):
        self.teaser_length = teaser_length
        super(TeaserField, self).__init__(*args, **kwargs)

    def to_native(self, value):
        return force_text(value[:self.teaser_length])


class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer(many=False, read_only=True)
    content = TeaserField(teaser_length=20)
    class Meta:
        model = models.Article
        fields = (
            'id'
            ,'title'
            , 'date_added'
            , 'content'
            , 'user'
        )


class IdeaSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer(many=False, read_only=True)
    teaser = myFields.TeaserField(teaser_length=200, original_field='content')

    class Meta:
        model = myModels.Idea
        fields = (
            'id'
            ,'title'
            , 'date_added'
            , 'user'
            , 'content'
            , 'teaser'
        )
class ArticleSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer(many=False, read_only=True)
    teaser = serializers.SerializerMethodField('get_teaser')

    class Meta:
        model = models.Article
        fields = (
            'id'
            ,'title'
            , 'date_added'
            , 'user'
            , 'teaser'
        )

    def get_teaser(self, obj):
        return force_text(obj.content[:20])