Вернуть user_id в ответ на сообщение API - PullRequest
0 голосов
/ 01 мая 2018

Я хочу вернуть user_id для каждого объекта, созданного с использованием post api.

Я хочу вывод в виде

[
{"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

1 Ответ

0 голосов
/ 01 мая 2018

Измените свой пост на следующее:

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() возвращает вновь созданный объект; просто используйте это и получите ПК в вашем ответе.

Кроме того, передовой практикой API является возвращение полного представления объекта; не удостоверение личности в одиночку. В идеале я бы сделал то, что вы сделали: {"data": serializer_post_data.data} -> это вернет полное вложенное представление. Вы по-прежнему должны иметь доступ к user_id как data.user_id. Однако, если вы уверены в своем сценарии использования, приведенный выше код будет работать.

Поскольку user_id является IntegerField и первичным ключом, Django ожидает, что вы предоставите значение для поля. Где вы присваиваете значение user_id - ваш API также публикует значение для user_id. Если вы хотите автоматически назначать значения, измените их на user_id = models.AutoField(primary_key=True)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...