【问题标题】:check if POST request exist in database and return custom response in django rest framework检查数据库中是否存在 POST 请求并在 django rest 框架中返回自定义响应
【发布时间】:2021-01-18 06:32:39
【问题描述】:

我正在创建基本的优惠券验证Django Rest框架APP,我只想通过邮递员传递json参数并在优惠券代码有效或无效时获得自定义响应。

这是我的 models.py 文件:

from django.db import models

# Create your models here.
class Coupon(models.Model):
    code = models.CharField(primary_key=True, max_length=50, unique=True)

    def __str__(self):
        return self.code

这是我的 Serializers.py 文件:

from rest_framework import serializers
from .models import Coupon


class CouponSerializer(serializers.ModelSerializer):
    class Meta:
        model = Coupon
        fields = '__all__'

我喜欢为给定的序列化程序编写视图并获取如上所述的自定义消息。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你可以UniqueValidator。示例代码:

    from rest_framework.validators import UniqueValidator
    from rest_framework import serializers
    from .models import Coupon
    
    ERROR_MESSAGE_CODE_UNIQUE = 'This code already exists'
    
    
    class CouponSerializer(serializers.ModelSerializer):
        email = serializers.CharField(
            max_length=50,
            validators=[
                UniqueValidator(
                    queryset=Coupon.objects.all(),
                    message=ERROR_MESSAGE_CODE_UNIQUE,
                )])
    
        class Meta:
            model = Coupon
            fields = '__all__'
    
    

    【讨论】:

      【解决方案2】:

      您可以为此使用 DRF APIViewmixins。 APIView 示例:

      class CouponValidationVie(APIView):
      
          queryset = Coupon.objects
      
          def get(self, request, code, format=None):
              try:
                  coupon = Coupon.objects.get(code=code)
              except Coupon.DoesNotExist:
                  return Response(
                      data={"message": "custom error message"}, status=status.HTTP_404_NOT_FOUND
                  )
              serializer = CouponSerializer(coupon)
              resp = {"data": serializer.data, "message": "custom success message"} 
              return Response(resp, status=status.HTTP_200_OK)
      

      如果发现Coupon 记录,它将序列化记录数据并用您自定义的“ok”消息进行响应;否则返回自定义“失败”消息。

      【讨论】:

      • 老板想自定义POST方法,伙计。在这种情况下不需要自定义视图,我认为只需要在模型中使用 Unique 或在 Serializer 中自定义创建/验证方法即可。
      • @VuPhan POST 方法对于简单地检索单个记录数据没有意义。无论如何,如果实际需要POST,OP 可以用适当的方法替换视图方法。 code 字段已经是一个独特的字段,但我相信您对序列化程序级别的验证是正确的 - 您将其作为 OP 问题的答案。
      • 对我有意义!
      • 'CouponValidationView' 应该包含queryset 属性,或者覆盖get_queryset() 方法。收到此错误
      【解决方案3】:

      打开 POSTMAN 并使用类似 {"code":"CouponCodeHere"} 的原始请求正文点击验证网址

      对于验证 url,写下以下视图:

      import json
      from yourApp.models import Coupon
      from django.http import HttpResponse
      
      def check_coupon(request):
          couponDict = json.loads(request.body)
          try:
              couponCode = couponDict["code"]
              #You can apply strip i.e couponCode.strip() here to remove white spaces at the start and end.
              if Coupon.objects.filter(code=couponCode).exists():  
                  return HttpResponse("valid")
      
              return HttpResponse("invalid")
      
          except KeyError:
              return HttpResponse("code does not exist in request body")
      
          except Exception as e:
              print(e) #For debugging purpose
              return HttpResponse("Error")
      

      【讨论】:

      • TypeError: check_coupon() 缺少 1 个必需的位置参数:“请求”出现此错误。
      • 请说明您如何将此视图映射到验证网址。在问题详情中添加urls.py
      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 2021-05-28
      • 2020-12-16
      • 1970-01-01
      • 2015-04-03
      • 2018-12-20
      • 2021-07-13
      • 2016-05-03
      相关资源
      最近更新 更多