#python #python-3.x #django #django-rest-framework
#python #python-3.x #django #django-rest-framework
Вопрос:
У меня есть модель комментариев, связанная с моделью пользователя
# models.py
class Comment(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
more fields...
....
В сериализаторе я хочу создать (ОПУБЛИКОВАТЬ) комментарий пользователя.
Но метод post не включен, только метод put или patch
Пример: пользователь Jon хочет создать комментарий
# serializers.py
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
class UserCommentSerializer(serializers.ModelSerializer):
# id of comment
url = serializers.HyperlinkedIdentityField(
view_name="user-comments-detail",
read_only=True
)
id = serializers.CharField(read_only=True)
comment = CommentSerializer()
class Meta:
model = User
fields = ['id', 'comment']
def create(self, validated_data):
comment_data = validated_data.pop('comment')
user = User.objects.create(**validated_data)
Comment.objects.create(user=user, **comment_data)
return user
Я хочу создать новый комментарий, ссылающийся на пользователя
# views.py
class CommentViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserCommentSerializer
Но у меня есть исключение, что у пользователя нет комментариев RelatedObjectDoesNotExist
Мой URL-адрес выглядит так
http://localhost:8000/user-comments/10
10 — это идентификатор пользователя pk
{} объект post
Пример: Comment.objects.create(user=pk, {})
В настоящее время включены только put и patch, но то, что я хочу сделать, это опубликовать пользователя
{
"url": "http://localhost:8000/user-comments/10",
"id": "10",
"comment": null
}
Комментарий не существует
Есть идеи или предложения?
Комментарии:
1. Что вы подразумеваете под «сделать комментарий»? Вы пытаетесь создать новую
Comment
запись в базе данных?2. @HuLuViCa Точно, я хочу создать новый комментарий
3. @BriseBalloches Извините, я исправил опечатку
4. @BriseBalloches та же ошибка
Ответ №1:
Для этого вам действительно нужен только один сериализатор.
Это создаст комментарий для текущего зарегистрированного пользователя.
# serializers.py
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
read_only_fields = ['user']
def create(self, validated_data):
# get the user who sent the request
user = self.context['request'].user
return Comment.objects.create(user=user, **validated_data)
# views.py
class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
def get_serializer_context(self):
# this is important since you want to pass the request object to your serializer
context = super().get_serializer_context()
context.update({"request": self.request})
return context
Ответ №2:
Исключение, которое вы получаете, связано с тем, что ModelSerializer
оно связано с определенной моделью, в данном случае вы связались UserCommentSerializer
с model User
. Переменная Meta.fields
указывает, какие поля модели возвращаются сериализатором, и, таким образом, вы получаете исключение, потому что для такой переменной установлено ('id', 'comment')
значение, а у модели User
нет поля comment
.
Таким образом, вы можете добиться того, чего хотите:
class UserCommentSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id']
extra_kwargs = {'comment': {'write_only': True}}
def create(self, validated_data):
comment_data = validated_data.pop('comment')
user = User.objects.create(**validated_data)
Comment.objects.create(user=user, comment=comment_data)
Комментарии:
1. Не работает, я отредактировал вопрос с более подробной информацией
2. @Alejandro Вы пытаетесь создать пользователя, в котором нет данных. Чего я не понимаю, так это того, что пользователь уже создан, и поэтому вы можете использовать request.user, или если вы хотите создать пользователя и комментарий одновременно?
3. @BriseBalloches Пользователь уже создан, мне нужно только создать комментарий, то, как я это делаю, не включает метод post.