【问题标题】:Django How to Retrieve Data using POST and returned the data with serializerDjango 如何使用 POST 检索数据并使用序列化程序返回数据
【发布时间】:2019-03-09 12:11:07
【问题描述】:

如何使用 POST 检索模型上的单个数据?

一开始,我的想法是传递参数映射。然后,服务器端的视图将负责读取地图中所需的参数并返回响应。

当我在 Postman 中对此进行测试时,我发送带有电子邮件和密码的请求正文,但随后它返回错误:'name is required'

我希望这个 api 像泛型一样工作。检索但不是用 url,而是用 POST 代替

模型.py

class Member(models.Model):
  name = models.CharField(max_length=100)
  password = models.CharField(max_length=100)
  email = models.EmailField(unique=True)
  phone = models.IntegerField(default=9999)

serializer.py

class LoginMemberSerializer(serializers.ModelSerializer):
  class Meta:
    model = Member
    fields =[
        'name',
        'password',
        'email',
        'phone',
    ]

view.py

class LoginMemberAPI(APIView):
    def get_queryset(self):
        return Member.objects.all()

    def post(self, request, format=None):
        serializer = LoginMemberSerializer(data=request.data)
        if serializer.is_valid():
            print(serializer.validated_data['email'])
            member = Member.objects.get(name = str(serializer.validated_data['name']))
            # serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

【问题讨论】:

  • 你能在邮递员中显示你发布的数据吗
  • 你发送username但在模型name?
  • @Exprator 谢谢,我编辑了它
  • @BearBrown 抱歉,我的意思是电子邮件和密码
  • 你试过勾选name键所在行的复选框吗?

标签: python django python-3.x django-rest-framework


【解决方案1】:

您的序列化程序正在使用模型的字段,并且在您的“成员”模型中,所有字段都是必需的。您不能使用相同的序列化程序来执行此操作。您可以为验证和返回序列化响应创建单独的序列化程序。像这样的东西。 响应序列化器:

class MemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = Member
        # '__all__' will include all fields of models
        fields = '__all__'

用于验证此 Api 的序列化程序:

class LoginMemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = Member
        fields =[
             'name',
             'password',
             ]

【讨论】:

  • 我更改了序列化程序并更改了最佳答案的视图,但仍然收到错误成员匹配查询不存在。 w
  • "会员匹配查询不存在。"表示您在表中没有给定查询/过滤器的记录。确保您尝试获取的记录存在于 db 中。
【解决方案2】:

好吧,序列化器确实无效,因为它应该是模型的完整表示,而您只发送一个字段。

为此使用序列化程序没有任何意义。只需使用数据查询数据库并然后为响应创建一个序列化程序:

member = Member.objects.get(**request.POST)
serializer = LoginMemberSerializer(member)
return Response(serializer.data)

我想说,您正在为此苦苦挣扎的事实应该能够表明这不是正确的做法。 POST 用于发送更新数据库的数据,而不是用于检索数据。

【讨论】:

  • 我收到错误“成员匹配查询不存在。”即使我只是在邮递员中发送姓名。如果这是错误的,这种情况的最佳解决方案是什么?我想不出任何解决方案。因为我的伙伴可以使用 PHP CI 实现这一点,也许这个案例也可以使用 django
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 2021-03-03
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多