代码之家  ›  专栏  ›  技术社区  ›  Alexey K

django rest framework-将字段从数据库添加到createapiview

  •  0
  • Alexey K  · 技术社区  · 6 年前

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

    最好显示代码来说明我的意图

    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
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   mehamasum    6 年前

    重写 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() 在序列化程序中,它用于只读目的。(例如,您需要发送一些额外的数据来响应,而不仅仅是 解释 )

    将其添加到只读字段:

    class LoyaltyUserCreateSerializer(serializers.ModelSerializer):
        class Meta:
            model = LoyaltyUser
            fields = (
                'name',
                'last_name',
                'gender',
                'email',
                'phone',
                'birth_date',
                'account'
            )
            read_only_fields = ('account',)