Django rest framework использует kwargs в сериализаторе

У меня есть модель Ingredient, в которой есть поле ForeignKey. Я использую modelSerializer для передачи данных. Я передаю recipe_id в url следующим образом recipes/{recipe.id}/ingredients. Мое текущее решение - изменить request.data в представлении, но я не уверен, что это правильный способ для такого распространенного случая.

Какой лучший способ передачи Recipe в сериализатор?

models.py

class Ingredient(TimeStamp):
    name = models.CharField(max_length=50)
    quantity = models.PositiveSmallIntegerField()
    recipe = models.ForeignKey(
        Recipe,
        on_delete=models.CASCADE,
        related_name='ingredients',
    )

serializers.py

class IngredientSerializer(serializers.ModelSerializer):

    class Meta:
        model = Ingredient
        fields = [
            'id',
            'name',
            'quantity',
            'unit',
            'recipe'
        ]

views.py

class IngredientViewSet(viewsets.ModelViewSet):
    serializer_class = IngredientSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        request.data['recipe'] = self.kwargs['pk']
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

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

context = self.get_serializer_context()
serializer = self.get_serializer(data=request.data, context=context)

если вы посмотрите исходный код для get_serializer_context:

    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self
        }

добавляет класс представления и запрос в контекст сериализатора.

в сериализаторе я переопределяю метод create и передаю данные о создании, диктуя id связанного объекта.

class S(ModelSerializer):
    def create(self, validated_data):
       validated_data['recipe_id'] = self.kwargs['pk']
       return super(S, self).create(validated_data)

и нет необходимости переопределять создание представления

Вернуться на верх