Как отправить POST в Django Rest, передав только ID отношений, а не весь словарь, после использования сериализаторов для связанных полей?
Я делаю небольшой учебник по Django Rest Framework, так как я никогда не использовал его раньше, хотя у меня есть некоторый опыт работы с Django с использованием шаблонов.
Я немного отклоняюсь от учебного курса, так как считаю, что так я лучше учусь, поэтому я дошел до того, что в простом приложении Movie Rating, когда вы делаете GET из сериализатора Ratings, вы получаете только идентификаторы FK и рейтинг "звезды", который я добавил:
[
{
"id": 1,
"user": 1,
"movie": 1,
"stars": 5
},
{
"id": 2,
"user": 1,
"movie": 4,
"stars": 4
}
]
Как я узнал в предыдущем уроке из упомянутого курса, я знаю, что можно указать сериализатор для каждого поля, так что вместо GET-запроса вы получаете словарь со всеми данными.
class RatingSerializer(serializers.ModelSerializer):
movie = MovieSerializer(many=False)
user = UserSerializer(many=False)
class Meta:
model = Rating
fields = ('id', 'user', 'movie', 'stars')
Таким образом, возврат из GET в маршрут Ratings показывает реляционные данные, а не только идентификаторы:
[
{
"id": 1,
"user": {
"id": 1,
"username": "admin",
"email": "admin@admin.com"
},
"movie": {
"id": 1,
"title": "Matrix 2",
"synopsis": "Neo is back."
},
"stars": 5
},
{
"id": 2,
"user": {
"id": 1,
"username": "admin",
"email": "admin@admin.com"
},
"movie": {
"id": 4,
"title": "Jurassic Park",
"synopsis": "Big chickens."
},
"stars": 4
}
]
Но теперь, когда я пытаюсь добавить новый рейтинг с помощью POST-запроса, при использовании формы-данных на Postman он говорит, что поля обязательны, хотя я уже передаю их, а когда я пытаюсь отправить POST, используя формат JSON, он возвращается, говоря мне, что я не могу передать только ID, что мне нужно передать целый словарь для полей "фильм" и "пользователь".
POST
http://127.0.0.1:8000/api/v1/ratings/
movie:4
stars:4
user:1
Я немного изучил этот вопрос и увидел ответ, в котором говорилось, что нужно переопределить "create", и я попробовал добавить это в свой класс Serializer (тот, что в предыдущем фрагменте кода), но безрезультатно. По-прежнему получаю те же ошибки, отказываясь принимать только идентификаторы
def create(self, validated_data):
id_movie = validated_data.pop('movies')
id_user = validated_data.pop('users')
movie = Movie.objects.get(id=id_movie)[0]
user = User.objects.get(id=id_user)[0]
return Rating
Что мне нужно сделать, чтобы иметь возможность передавать в POST только идентификаторы, а не все данные для каждого поля? Переопределение "create" - это правильный путь, и я что-то упустил в своем коде? Или это неправильный способ?
Заранее спасибо.