Django Model保存前检查数据类型的完整性

时间:2018-01-08 15:38:55

标签: mysql django

我有一个Django项目,我被迫做一个原始的SQL查询(所以不使用模型来保存这些信息),但我仍然想检查这个查询的一些参数的正确性或数据类型。假设我有这个模型:

class MyModel(Model):
    name = models.CharField(max_length=768)
    product_count = models.PositiveIntegerField(null=True, blank=True)
    paid_amount = models.DecimalField(decimal_places=2, blank=True)

我想做一个简单的Raw SQL查询,如:

insert into mymodel (name, product_count, paid_amount) values (%s, %s, %s);

现在我知道我可以直接使用Django模型做到这一点,但是请让我们认为我被迫用原始SQL 执行此操作(同样我的真实查询与此相比非常不同,我是只是举一个例子揭露我的案例。)

现在,我想在Raw SQL上插入三个变量,但是对于每个变量我想检查数据类型,所以在调用数据库insert之前,我想使用我的Django用于检查其类型的模型:

  • 检查我的name变量是否实际为字符串(也许它不会传递768个字符,但只检查字符串是否正常)。
  • 检查我的product_count变量是否为正整数。
  • 检查我的paid_amount是否为十进制数。

我很乐意,如果它会是这样的话:

m = MyModel(name=name, product_count=product_count, paid_amount=paid_amount)
if m.check_types(): # that could give an error if some of the fields are wrong.
    cursor.execute("""insert into mymodel (name, product_count, paid_amount) values (%s, %s, %s ...
    ...

Django有类似check_types()方法的内容吗?

1 个答案:

答案 0 :(得分:1)

您可以使用表单,用数据填充它并检查它是否有效。

class MyModel(Model):
    name = models.CharField(max_length=768)
    product_count = models.PositiveIntegerField(null=True, blank=True)
    paid_amount = models.DecimalField(decimal_places=2, blank=True)

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['name', 'product_count', 'paid_amount']        

然后,您的代码看起来像:

 data = {'name': name, 'product_count': product_count, 'paid_amount': paid_amount }
 model_form = MyModelForm(data)
 if model_form.is_valid():
     cursor.execute("""insert into mymodel ...""")