我想保存模型,但一个字段必须从数据库获取数据。
更好地展示代码来说明我的意图
class LoyaltyUserCreateSerializer(serializers.ModelSerializer):
account = serializers.SerializerMethodField()
class Meta:
model = LoyaltyUser
fields = [
'name',
'last_name',
'gender',
'email',
'phone',
'birth_date',
'account'
]
def get_account(self, obj):
return Account.objects.get(pk=self.context['request'].user.pk)
数据我送
{"name": "Petr1", "last_name": "Petrov", "gender": "male", "email": "email", "phone": "123", "birth_date": "2018-12-12"}
问题是,当我试图把它与CreateAPI救我得到500错误与
IntegrityError at /api/create_user
NOT NULL constraint failed: core_loyaltyuser.account_id
视图
class LoyaltyUserCreateAPIView(CreateAPIView):
queryset = LoyaltyUser.objects.all()
serializer_class = LoyaltyUserCreateSerializer
覆盖perform_create
CreateAPIView的方法:
class LoyaltyUserCreateAPIView(CreateAPIView):
queryset = LoyaltyUser.objects.all()
serializer_class = LoyaltyUserCreateSerializer
def perform_create(self, serializer):
serializer.save(account_id=self.request.user.pk) # updated after feedback
见docs
此外,你并不需要在你的序列化定义为account
serializers.SerializerMethodField()
,它用于只读目的。 (例如,你需要做的响应发送一些额外的数据,而不是只account
的ID)
将它添加到read_only_fields代替:
class LoyaltyUserCreateSerializer(serializers.ModelSerializer):
class Meta:
model = LoyaltyUser
fields = (
'name',
'last_name',
'gender',
'email',
'phone',
'birth_date',
'account'
)
read_only_fields = ('account',)