我正在研究一个包含构建文章应用程序的教程。我有一个要序列化的Article模型,并且很好奇为什么使用ModelSerializer时需要显式设置某些字段。
这是我的模特:
from django.db import models
from core.models import TimestampedModel
class Article(TimestampedModel):
slug = models.SlugField(db_index=True, max_length=255, unique=True)
title = models.CharField(db_index=True, max_length=255)
description = models.TextField()
body = models.TextField()
author = models.ForeignKey('profiles.Profile', on_delete=models.CASCADE, related_name='articles')
def __str__(self):
return self.title
相当标准的东西。下一步是序列化我的serializers.py文件中的模型数据:
class ArticleSerializer(serializers.ModelSerializer):
author = ProfileSerializer(read_only=True) # Three fields from the Profile app
description = serializers.CharField(required=False)
slug = serializers.SlugField(required=False)
class Meta:
model = Article
fields = (
'author',
'body',
'createdAt',
'description',
'slug',
'title',
'updatedAt',
)
具体来说,如果我使用author
并从模型中提取这些字段,为什么我需要显式声明description
,slug
和serializers.ModelSerializer
字段我下面的class Meta:
?
谢谢!
答案 0 :(得分:1)
在Django-Rest-Framework文档中,drf-docs/model_serializer/specifying-which-fields-to-include表示:
如果只希望在模型序列化器中使用默认字段的子集,则可以使用字段或排除选项,就像使用ModelForm一样。强烈建议您使用fields属性显式设置应序列化的所有字段。这将减少在模型更改时导致意外暴露数据的可能性。
因此,通过在序列化器fields =
中使用META
,您可以仅指定所需的字段,而不返回诸如id
之类的重要字段,或诸如更新和创建的时间戳之类的专有信息。 / p>
您也可以使用fields
代替使用exclude
,它再次使用一个元组,但只排除不需要的字段。
当您的数据库表包含很多信息时,这些功能特别有用,返回所有这些信息(尤其是如果列出了这些信息)会导致返回的JSON大,其中前端可能只使用一小部分已发送的数据。 / p>
DRF设计了这样的框架来专门解决这些问题。
答案 1 :(得分:0)
我认为,我们应该在序列化程序中为以下字段定义字段:
id
serializers.SerializerMethodField()
这样的序列化程序中的自定义字段必须在fields
中进行定义最后,如果您不想要,则可以在不定义fields
的情况下定义序列化程序。它会正常工作