Django REST模型序列化程序--一般问题
我正在学习一个教程,其中包括构建一个articles应用程序。我有一个正在序列化的文章模型,我很好奇为什么在使用ModelSerializer时需要显式设置某些字段 这是我的模型:Django REST模型序列化程序--一般问题,django,serialization,django-rest-framework,Django,Serialization,Django Rest Framework,我正在学习一个教程,其中包括构建一个articles应用程序。我有一个正在序列化的文章模型,我很好奇为什么在使用ModelSerializer时需要显式设置某些字段 这是我的模型: from django.db import models from core.models import TimestampedModel class Article(TimestampedModel): slug = models.SlugField(db_index=True,
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
相当标准的东西。下一步是序列化my 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',
)
具体来说,如果我使用的是序列化程序.ModelSerializer
并从下面的类Meta:中的模型中提取这些字段,为什么我需要显式地声明作者
、描述
和slug
字段
谢谢 在我看来,我们应该在序列化程序中为以下内容定义字段:
- 您的api使用序列化程序不需要模型的所有数据。然后可以限制序列化程序可以获取的字段。如果你有这么多数据,它会更快
- 您不希望模型的所有字段都是公共的。例如
id
- 序列化程序中的自定义字段,如
序列化程序。SerializerMethodField()
必须在字段中定义才能工作
最后,如果不需要,可以定义序列化程序,而无需定义字段。它将正常工作在Django Rest框架文档中,它说:
如果您只希望在模型序列化程序中使用默认字段的子集,则可以使用字段或排除选项,就像使用ModelForm一样。强烈建议您使用fields属性显式设置所有应序列化的字段。这将减少在模型更改时无意中暴露数据的可能性。
因此,通过在序列化程序META
中使用fields=
,您可以只指定所需的字段,而不返回重要字段,如id
,或验证信息,如更新和创建的时间戳
您也可以不使用字段
,而使用排除
,它再次接受元组,但只排除不需要的字段
当数据库表包含大量信息时,这些信息特别有用,返回所有这些信息(尤其是在列出这些信息时)可能会导致大量返回JSON,其中前端可能只使用发送数据的一小部分
DRF设计了这样的框架来专门解决这些问题。没错,但在我的例子中,在Meta上面,我明确地设置了这三个字段。既然我要在我的Meta类中再次声明这三个相同的字段,那么这样做对我来说是完全多余的吗?只有当我需要在我的描述/段塞字段中包含其他属性时,我才需要显式定义字段,例如:“required=False”。如果我没有明确说明,我假设这些字段是真的@朱皮亚里明白你的意思了。我怀疑他们为什么不自动包含您在字段中指定的内容,是因为大多数时候我们构建继承其他序列化程序的新序列化程序,但这些继承的序列化程序可能不希望返回基本序列化程序指定的所有字段。因此,尽管在编写两次所需的字段时似乎要加倍努力,但在我遇到的大规模应用程序中,使用大量序列化程序继承,指定所需的确切字段会有很大帮助。希望对你有帮助。非常感谢。当我完成本教程的工作时,我将仔细检查这些字段。我已经完成了一半,涉及使用继承的ModelSerializer的每个实例都表明我们正在更改每个字段的默认序列化程序属性。如果您感兴趣,几天前我发布了一个问题,关于如何动态定义字段而不在文件中写入序列化程序,如果我对默认的\uuuu init\uuuu()
进行了重写,以允许在运行时传递字段,那么该帖子中的代码可能会帮助您了解为什么在中传递特定字段具有优势。还没有答案,我还没有找到解决办法。