【问题标题】:Django how to validate request in views against a modelDjango如何根据模型验证视图中的请求
【发布时间】:2015-09-16 09:53:00
【问题描述】:

在django模型中,保存请求的视图有n列,那么如何根据模型验证字段以检查请求是否具有所有强制变量,例如:

models.py

class candidate(models.Model):
   name = models.IntegerField()
   college = models.TextField()
   city = models.TextField()
   state = models.IntegerField(null=True)
   country = models.CharField(max_length=255,null=True)
   phone = models.IntegerField(null=True)

views.py

def save(request):
   try:
     data = json.loads(request.body)
     if 'name' in data and 'college' in data and 'city' in data:
              //do something

这是正确的做法吗?

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    由于您没有将字段名称、大学、城市标记为可选(即空白=True 或 null=True),因此如果缺少这些字段,则会自动标记错误。

    但是,如果您想跨字段执行自定义检查,那么最佳做法是为您的模型类定义一个干净的方法,并在调用 save 之前调用它。

    class candidate(models.Model):
       name = models.IntegerField()
       college = models.TextField()
       city = models.TextField()
       state = models.IntegerField(null=True)
       country = models.CharField(max_length=255,null=True)
       phone = models.IntegerField(null=True)
    
       def clean(self):
           if (self.name is None) or (self.college' is None) or (self.city is None):
                raise ValidationError('xxx')
    

    https://docs.djangoproject.com/en/1.8/ref/models/instances/#validating-objects

    【讨论】:

    • @daniel 不应该将验证逻辑放置在模型本身中,以便无论通过表单或序列化程序(REST 框架)进行输入,都可以重复使用相同的验证代码?
    • 这取决于您如何接受用户输入 - 是通过网站上的表单(如 Daniel 建议的那样),还是通过 REST apis 上的移动应用程序?
    • 那么我建议你阅读 django-rest-framework.org 并安装 django-rest-framework。您必须首先创建一个名为 serializers.py 的文件,在其中定义与您的候选模型相对应的 ModelSerializer 类。然后,在 views.py 中,您可以简单地编写通用视图,说明使用哪个序列化器将字段编码/解码为 JSON 格式。最后,将 api 的 url 映射为指向该视图。 Django rest 框架教程是一个很好的起点。
    【解决方案2】:

    没有。您为此使用表单。

    请参阅documentation on formshow to use them with models

    【讨论】:

    • 那么您使用的是为 REST 设计的框架。正如 Tanuka 建议的那样,Django Rest Framework。
    • 所以总结如问题意见中所述是解决问题的方法。对吗?
    • 没有。没有人这么说,事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2023-04-09
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多