Django REST ModelSerializer-一般问题

时间:2018-12-04 01:54:32

标签: django serialization django-rest-framework

我正在研究一个包含构建文章应用程序的教程。我有一个要序列化的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并从模型中提取这些字段,为什么我需要显式声明descriptionslugserializers.ModelSerializer字段我下面的class Meta:

谢谢!

2 个答案:

答案 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)

我认为,我们应该在序列化程序中为以下字段定义字段:

  • 您的api使用序列化器不需要您模型的所有数据。然后您可以限制字段可以通过串行器获取。如果您有大量数据,它会更快。
  • 您不希望公开模型的所有字段。例如id
  • serializers.SerializerMethodField()这样的序列化程序中的自定义字段必须在fields中进行定义

最后,如果您不想要,则可以在不定义fields的情况下定义序列化程序。它会正常工作