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)
и нет необходимости переопределять создание представления