Python Django PositiveIntegerField接受否定

Python Django PositiveIntegerField接受否定,python,django,django-models,Python,Django,Django Models,我的Django应用程序(视图)中有一个带有PositiveIntegerField的模型: 但是,当我测试它时,它接受负值: 测试: 失败: 我做错什么了吗 我试着用int(-10)和int(“-10”)测试它,以防它是一个字符串格式错误,我得到了很多 卡塔瓦兰的回答包括: post.full_clean() 同样失败。以下是文件章节的摘录: 请注意,调用模型的save()方法时,不会自动调用full\u clean()。当您想要为自己手动创建的模型运行一步模型验证时,需要手动调用它 因此,

我的Django应用程序(视图)中有一个带有PositiveIntegerField的模型:

但是,当我测试它时,它接受负值:

测试:

失败:

我做错什么了吗

我试着用int(-10)和int(“-10”)测试它,以防它是一个字符串格式错误,我得到了很多

卡塔瓦兰的回答包括:

post.full_clean()

同样失败。

以下是文件章节的摘录:

请注意,调用模型的
save()
方法时,不会自动调用
full\u clean()
。当您想要为自己手动创建的模型运行一步模型验证时,需要手动调用它

因此,验证和保存模型应如下所示:

post = Post(author=test_user_profile, title='Django Testing',
            content='hello world', views=-10)
post.full_clean()
post.save()
更新:似乎已关闭SQLite后端的此验证。我在
django.db.backends.sqlite3.operations.DatabaseOperations
类中找到了这段代码

def integer_field_range(self, internal_type):
    # SQLite doesn't enforce any integer constraints
    return (None, None)
此方法中的值用于为
PositiveIntegerField
构建验证器

据我所知,这是出于兼容性的原因。因此,如果要使用SQLite,则必须手动添加验证程序:

from django.core.validators import MinValueValidator

class Post(models.Model):
    ...
    views = models.PositiveIntegerField(default=0,
                                        validators=[MinValueValidator(0)])

修改后,
full\u clean()
应该可以正常工作。

在数据库级别检查正性,SQLite引擎根本不检查它。它在1.7版本中进行了更改,您使用的是哪个版本的django?使用上述代码段,该模型仍然接受否定。使用
full_clean()
clean()
clean_fields()
不会引发任何异常,也不会报告任何错误。这非常好,谢谢。我假设PositiveIntegerFields会自动验证。@Ewan会,但使用SQLite时除外,SQLite会删除验证程序
post = Post(author=test_user_profile, title='Django Testing',
            content='hello world', views=-10)
post.full_clean()
post.save()
def integer_field_range(self, internal_type):
    # SQLite doesn't enforce any integer constraints
    return (None, None)
from django.core.validators import MinValueValidator

class Post(models.Model):
    ...
    views = models.PositiveIntegerField(default=0,
                                        validators=[MinValueValidator(0)])