【问题标题】:Return user_id as response of post api返回 user_id 作为 post api 的响应
【发布时间】:2018-10-11 11:34:05
【问题描述】:

我想为使用 post api 创建的每个对象返回 user_id

我想以

的形式输出
[
{"info": {
        "status": "SUCCESS",
        "message": "User Details Successfully Uploaded"
        },
        "user_id": 10001
    }
]

这是我的代码

Serializer.py

class UserDetailsSerializer(serializers.ModelSerializer):
    """docstring for UserDetailsSerializer"""
    class Meta:
        model = UserDetails
        fields = ['user_id', 'user_email', 'user_full_name', 'user_token', 'patient_id', 'user_preferences']
        read_only_fields = ['user_id']

Views.py

class UserDetailsViewSet(APIView):

    def get(self, request):
        queryset= UserDetails.objects.all()
        serializer_class=UserDetailsSerializer(queryset,many=True)
        return Response(serializer_class.data)

    def post(self, request):
        serializer_class_post=UserDetailsSerializer(data=request.data)
        if serializer_class_post.is_valid():
            try:
                serializer_class_post.save()
                return Response([{"info": {
                    "status": "SUCCESS",
                    "message": "User Details Successfully Uploaded"
                },
                    "user_id": serializer_class_post.data
                }], status=status.HTTP_201_CREATED)
            except IntegrityError as e:
                return Response([{"info": {
                    "status": "Error",
                    "message": "Error Uploading User Details"
                }
                }], status=status.HTTP_400_BAD_REQUEST)
        return Response(serializer_class_post.errors, status=status.HTTP_400_BAD_REQUEST)`

models.py

class UserDetails(models.Model):
    user_id = models.IntegerField(primary_key= True)
    user_email = models.CharField(max_length=254)
    user_full_name = models.CharField(max_length=200)
    user_token = models.CharField(max_length=200)
    patient_id = models.CharField(max_length=12, unique=True)
    user_preferences = models.CharField(max_length=200)

    class Meta:
        managed = False
        db_table = 'walnut_users'

    def __str__(self):
        return self.user_id

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    将您的帖子更改为以下内容:

    def post(self, request):
        serializer_class_post=UserDetailsSerializer(data=request.data)
        if serializer_class_post.is_valid():
            try:
                obj = serializer_class_post.save()
                return Response([{"info": {
                    "status": "SUCCESS",
                    "message": "User Details Successfully Uploaded"
                },
                    "user_id": obj.pk
                }], status=status.HTTP_201_CREATED)
            except IntegrityError as e:
                return Response([{"info": {
                    "status": "Error",
                    "message": "Error Uploading User Details"
                }
                }], status=status.HTTP_400_BAD_REQUEST)
        return Response(serializer_class_post.errors, status=status.HTTP_400_BAD_REQUEST)`
    

    serializer.save() 返回新创建的对象;只需使用它并在您的响应中获取 pk。

    此外,API 最佳实践是返回完整的对象表示;不仅仅是身份证。理想情况下,我会做你所做的事情:{"data": serializer_post_data.data} -> 这将返回完整的嵌套表示。您应该仍然能够以data.user_id 的身份访问user_id。但是,如果您确定自己的用例,上面的代码将起作用。

    由于user_id 是一个 IntegerField 和主键,因此 Django 期望您提供该字段的值。您在哪里为 user_id 分配值 - 您的 API 是否也发布了 user_id 的值。如果要自动分配值,请将其更改为 user_id = models.AutoField(primary_key=True)

    【讨论】:

    • [ { "info": { "status": "SUCCESS", "message": "用户详细信息上传成功" }, "user_id": null } ] 返回null
    • user_id 是一个自动增量字段 api 应该返回 user_id 给用户
    • 你能添加你的模型定义吗?
    • 类 UserDetails(models.Model): user_id = models.IntegerField(primary_key= True) user_email = models.CharField(max_length=254) user_full_name = models.CharField(max_length=200) user_token = models。 CharField(max_length=200) Patient_id = models.CharField(max_length=12, unique=True) user_preferences = models.CharField(max_length=200) class Meta: managed = False db_table = 'walnut_users' def __str__(self): return self。 user_id
    • 你在哪里为 user_id 赋值 - 你的 API 是否也发布了 user_id 的值。如果要自动分配值,请将其更改为 user_id = models.AutoField(primary_key=True)。如果它是 IntegerField 和主键,那么 Django 期望您提供该字段的值
    猜你喜欢
    • 2021-01-15
    • 2019-10-16
    • 2019-03-16
    • 1970-01-01
    • 2017-09-30
    • 2022-01-23
    • 2021-08-10
    • 2020-04-28
    • 2021-09-09
    相关资源
    最近更新 更多