Как публиковать ссылки в Django Rest Framework

#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.