#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’ сделала это. Спасибо