Главный вопрос Джанго о сериализаторах - PullRequest
0 голосов
/ 01 декабря 2018

Быстрый концептуальный вопрос для вас.Я работаю над учебником по Django, который включает в себя создание API-интерфейса через django (с использованием v 2.1).У меня есть следующий сериализатор для обработки объектов комментариев из моей модели комментариев в приложении статей.

class CommentSerializer(serializers.ModelSerializer):
author = ProfileSerializer(required=False)

createdAt = serializers.SerializerMethodField(method_name='get_created_at')
updatedAt = serializers.SerializerMethodField(method_name='get_updated_at')

class Meta:
    model = Comment
    fields = (
        'id',
        'author',
        'body',
        'createdAt',
        'updatedAt',
    )

def create(self, validated_data):
    article = self.context['article']
    author = self.context['author']

    return Comment.objects.create(
        author=author, article=article, **validated_data
    )

Я хочу лучше понять этот раздел кода:

def create(self, validated_data):
    article = self.context['article']
    author = self.context['author']

В частности, откуда берется «контекст»?У меня достаточно понимания того, что именно здесь происходит, мне более или менее просто любопытно, какая механика стоит за тем, что здесь происходит.Например, мы не указали контекст как переменную аргумента в функции create.Контекст исходит из моей модели?Есть ли какая-то магия django, происходящая в rest_framework, которая назначает (может быть, весь экземпляр) переменную контекста?

Спасибо всем!

1 Ответ

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

На самом деле это связано с дополнительным контекстом .Вы можете передать его в сериализатор из View и использовать в сериализаторе.Например:

def post_comment(request, article_id):
    post_data = request.data
    article = Article.objects.get(pk=article_id)
    context = {'author': request.user, 'article':article}
    serializer = YourSerializer(data=data, context=context)  # <--- You are passing context from view
    # This is the very same context you are catching in your create method
    if serializer.is_valid():
         serializer.save()
         # rest of your code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...