Python 序列化字段时如何获取字符串片段(Django/DRF)

Python 序列化字段时如何获取字符串片段(Django/DRF),python,django,django-rest-framework,Python,Django,Django Rest Framework,第一次在这里问,我会尽量听起来聪明! 因此,我有一个名为“Article”的模型,我用1000多个字符的文本填充了它的“text”字段。当我通过端点发送一个“Article”序列化对象时,如何使我只发送“text”字段的前200个字符 views.py class ArticleScrape(generics.ListAPIView):

第一次在这里问,我会尽量听起来聪明! 因此,我有一个名为“Article”的模型,我用1000多个字符的文本填充了它的“text”字段。当我通过端点发送一个“Article”序列化对象时,如何使我只发送“text”字段的前200个字符

views.py

class ArticleScrape(generics.ListAPIView):                                                                                                                                                                          
    queryset = Article.objects.all()                                                                                                                                                                                
    serializer_class = ArticleSerializer                                                                                                                                                                            

    def list(self,request):                                                                                                                                                                           
        serializer = ArticleSerializer(queryset, many=True)                                                                                                                                                         
        return Response(serializer.data) 
序列化程序.py

class ArticleSerializer(serializers.ModelSerializer):                                                                                                                                                               
    authors = EachAuthorSerializer(many=True,read_only=True)                                                                                                                                                        
    tags = EachTagSerializer(many=True,read_only=True)                                                                                                                                                              
    text = serializers.CharField(max_length=200)                                                                                                                                                                    
    class Meta:                                                                                                                                                                                                     
        model = Article                                                                                                                                                                                             
        exclude=('id',) 

我是否需要在queryset中执行此操作?在序列化程序中?我是否为字段添加注释?我试过很多次,但都没有成功。提前感谢您的帮助

有不同的方法,我喜欢的第一种方法是将属性添加到模型中,并将其字段添加到序列化程序中:

class Article(models.Modle):
    ...
    @property
    def summary(self):
        return self.text[:200]


class ArticleSerializer(serializers.ModelSerializer):                                                                                                                                                               
    summary = serializers.CharField()                                                                                                                                                        
对于第二种方法,您可以使用SerializerMethodField:

class ArticleSerializer(serializers.ModelSerializer):                                                                                                                                                               
    summary = serializers.SerializerMethodField() 

    def get_summary(self, obj):
        return obj.text[:200]

另一种方法是创建自己的自定义字段:

class CustomCharField(serializers.CharField):

    def __init__(self, repr_length, **kwargs):
        self.repr_length = repr_length
        super(CustomCharField, self).__init__(**kwargs)

    def to_representation(self, value):
        return super(CustomCharField, self).to_representation(value)[:self.repr_length]
并在序列化程序中使用它:

class ArticleSerializer(serializers.ModelSerializer):
    text = CustomCharField(repr_length=200)

我喜欢zeynel提出的“CustomCharField”方法。这个版本使用Django的

来自django.utils.text导入截断器的

从rest_框架导入序列化程序
类TruncatedCharField(serializers.CharField):
定义初始值(自,长度=200,**kwargs):
self.length=长度
超级()
def到_表示(自身、值):
repr_u=super().到_表示(值)
返回截断符(repr_).chars(self.length)

您的意思是只返回API响应中
文本
字段的前200个字符吗?完全正确!这就是我想要的,很干净。最后,我混合使用了另外两个答案:。对我来说,很难吸收在Django做同样事情的所有方法。有选择是很好的,但它太强大了……我明白了,这看起来很聪明,根本不涉及数据库