Django REST ModelSerializer --- Общий вопрос - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю над учебником, который включает в себя создание приложения статей.У меня есть модель 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 и вытягивая эти поля из моей модели в моем <strong>class Meta:</strong> ниже?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В документации Django-Rest-Framework, drf-docs / model_serializer / указание, какие поля для включения , это говорит:

Если вы хотите только подмножествополя по умолчанию, которые будут использоваться в сериализаторе модели, вы можете сделать это с помощью полей или исключить опции, как если бы вы использовали ModelForm.Настоятельно рекомендуется явно установить все поля, которые должны быть сериализованы, с помощью атрибута fields.Это уменьшит вероятность непреднамеренного раскрытия данных при изменении ваших моделей.

Поэтому, используя fields = в Сериализаторе META, вы можете указать только необходимые поля, не возвращая жизненно важные поля, такие как id, или лишнюю информацию, такую ​​как обновленные и созданные метки времени.

Вы также можете вместо fields использовать exclude, который снова принимает кортеж, но исключает поля, которые вам не нужны.

Это особенно полезно, когда таблица базы данных содержитбольшое количество информации, возвращающей всю эту информацию, особенно если она указана в списке, может привести к большим возвращаемым значениям JSON, где веб-интерфейс может использовать только небольшой процент отправляемых данных.

DRF спроектировал свою структуру следующим образомспециально бороться с этими проблемами.

0 голосов
/ 04 декабря 2018

По моему мнению, мы должны определить поле в сериализаторе для:

  • Ваш сериализатор API использует не все данные ваших моделей.Тогда вы можете ограничить поле можно получить по сериализатору.Это быстрее, если у вас так много данных.
  • Вы не хотите, чтобы все поля вашей модели были доступны.Пример, подобный id
  • Пользовательское поле в сериализаторе, например serializers.SerializerMethodField(), должно определяться в fields для работы

Наконец, если вы не хотите, вы можете определить сериализатор без определения fields.Его будет работать нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...