Python Django-Rest-Framework обновляет пользователя при создании данных

#python #django #django-rest-framework #django-serializer

#python #django #django-rest-framework #django-сериализатор

Вопрос:

Предполагая, что у меня есть 2 модели, один пользователь, другой пост. Пользователь может создавать сообщения. У пользователя есть поле с именем ‘exp_pts’ в виде целого поля. Это должно увеличиваться, скажем, на 30, когда пользователь создает сообщение.

Я предполагаю, что мне пришлось бы использовать метод create() в PostSerializer. Это мой текущий сериализатор для сообщений (в настоящее время не работает из-за того, что метод create() работает не так, как предполагалось)

 class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ('id', 'user', 'kingdom', 'post_type', 'file_path',
                  'title', 'description', 'created_at', 'updated_at')

    def to_representation(self, instance):
        data = super().to_representation(instance)
        data['user'] = SimpleUserSerializer(
            User.objects.get(pk=data['user'])).data
        data['kingdom'] = KingdomSerializer(
            Kingdom.objects.get(pk=data['kingdom'])).data
        return data

    # This is not yet working
    def create(self, validated_data):
        user = validated_data.pop('user')
        user.exp_pts  = 30
        user.save()
        return user
  

Каков способ сделать это выше? Если метод create() неадекватен, то какой другой способ существует для достижения этого? Любая помощь очень ценится. Спасибо.

Ответ №1:

Ваш create метод неверен. Это должно быть больше похоже на это:

 def create(self, validated_data):
        user = validated_data.pop('user')
        user.exp_pts  = 30
        user.save()

        return super().create(validated_data)
  

create Метод вашего сериализатора должен возвращать экземпляр созданного Post , а не User . Поскольку фактическое создание может быть обработано самим DRF, просто верните super().create(validated_data) .

Комментарии:

1. Спасибо за комментарий, я понимаю, что вы имеете в виду, однако это все еще выдает эту ошибку:django.db.utils. Ошибка целостности: сбой ограничения NOT NULL: api_post.user_id

2. ах, у вашей post модели есть пользователь FK. тогда не pop пользователь из dict, а get он.

3. замена ‘pop’ на ‘get’ сделала это. Спасибо