Django的REST框架 - 从数据库中添加字段CreateAPIView

问题描述 投票:0回答:1

我想保存模型,但一个字段必须从数据库获取数据。

更好地展示代码来说明我的意图

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
django django-rest-framework
1个回答
2
投票

覆盖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',)
© www.soinside.com 2019 - 2024. All rights reserved.