django中ORM的字段类型和对应的sql字段类型

2 篇文章 0 订阅
1 篇文章 0 订阅

Django ORM中常用的字段类型以及参数配置


一、数值型

  • AutoField() 对应sql中的 int() 。自增主键,Django Model默认提供,可以被重写。
  • BooleanField() 对应sql中的 tinyint()。布尔类型字段,一般用于记录状态标记。
  • DecimalField() 对应sql中的 decimal()。开发对数据精准要求较高大的业务时考虑使用。比如:cash=models.DecimalField(max_length=8, decimal_places=2, default=0, verbose_name=“金额”),就是定义长度为8位、精度位2位的数字,例如数字:123456.12。
  • IntergerField() 对应sql中的 int() 。同AutoField一样,唯一的差别就是不自增。
  • PositiveIntegerField() IntegerField()  只包含正整数。
  • SmallIntegerField() 对应sql中的 smallint() 。小整数时一般会用到。


二、字符型

​django对应到sql中有两种类型:longtext和varchar。

​除了TextField是longtest类型外,其他属于varchar类型。

  • CharField() 对应sql中的 varchar() 。基础的varchar类型。
  • URLField() 继承自 CharField() ,但是实现了对URL特特殊处理。用来存储URL数据,非URL数据可以在业务层就拒绝掉,不会存入数据库中。
  • UUIDField() 对应sql中的 char(32) 。除了在PostgreSQL中使用的是uuid类型外,在其他数据库中均是固定长度char(32),用来存放生成的唯一id。
  • EmailField() 同URLfield一样继承自CharField,多了对email的特殊处理。
  • FileField() 同URLField一样,它继承自CharField,对了对文件的特殊处理。
  • TextField() 对应sql中的 longtext。一般用于存放大量文本内容,比如新闻正文、博客正文。
  • ImageField() 继承自FileField,用来处理图片相关的数据,在展示上会有所不同。


三、日期类型


​ django中有3中日期类型,分别对应Mysql的date、datetime和time

  • DateField() 对应sql中的 date()
  • DateTimeField() 对应sql中的 datetime
  • TimeField()  对应sql中的 time


四、关系类型

ForeignKey,外键
OneToOneField,一对一
ManyToManyField,多对多


五、参数


上面django所提供的字段都是类。比如models.CharField的定义就是:class CharField:。

每个字段里面都提供了参数可以选择:

null可以同blank进行对比。null用于设定在数据库层面是否允许为空
blank针对业务层面,该值是否允许为空。
choices配置字段的choices后,在admin页面上就可以看到对应的可选项展示。
db_column默认情况下,定义的field就是对应数据库中的字段名称,通过这个参数可以指定Model中的某个字段对应数据库中的哪个字段。
db_index数据库索引配置。
default默认值配置。
editable是否可编辑,默认是True。如果不想这个字段显示在页面上,可以配置为False。
error_messages用来自定义字段值校验失败时的异常提示,它是字典格式。key的值可选项为null、blank、invalid、invalid_choice、unique和unique_for_date。
verbose_name字段对应的展示文案。
validators自定义校验逻辑,同form类似。
unique_for_month针对年份的联合约束。
unique_for_month针对月份的联合约束 。
help_text字段提示语,配置这一项后,在页面对应字段的下方会展示此配置。
primary_key主键,一个Model只允许设置一个字段为primary_key。
unique唯一约束,当需要配置唯一值时,设置unique=True,设置此项后,不需要设置db_index。
unique_for_date针对date(日期)的联合约束。比如说一天只能写一篇博文,即:unique_for_date=“博文”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在Django ORM进行多个字段的分组查询,与直接执行SQL语句查询结果不一致,可能是因为在Django ORM默认情况下,会对查询结果进行自动去重。 为了确保Django ORM的查询结果与执行原生SQL语句的结果一致,你可以使用`.values()`方法的参数`distinct=True`来强制去重。 以下是一个示例,展示了如何在Django ORM进行多个字段的分组查询,并确保结果与执行原生SQL语句的结果一致: ```python from myapp.models import MyModel result = MyModel.objects.values('field1', 'field2').distinct(True) ``` 在上面的示例,我们使用`.values('field1', 'field2')`来指定按照`field1`和`field2`字段进行分组,并使用`.distinct(True)`来强制去重。这样可以确保查询结果与执行原生SQL语句的结果一致。 另外,还可以使用`.raw()`方法执行原生SQL语句查询,以获得更直接的结果。例如: ```python from django.db import connection query = "SELECT field1, field2 FROM myapp_mymodel GROUP BY field1, field2" with connection.cursor() as cursor: cursor.execute(query) result = cursor.fetchall() ``` 在上面的示例,我们使用`.raw()`方法执行原生SQL语句查询,并使用`cursor.fetchall()`获取查询结果。 通过以上方法,你应该能够确保Django ORM多个字段分组查询的结果与执行原生SQL语句查询的结果一致。如果问题仍然存在,请提供更多的详细信息,以便我能够更好地帮助你解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值