models中的常用字段
AutoField(primary_key=True) 主键 (int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。)
CharField(max_length=32) varchar(32)
IntegerField() int
BigIntergerField() bigint
DecimalField() decimal
EmailField() varchar(254)
DateField() date
DateTimeField() datetime
auto_now:每次编辑数据的时候都会自动更新该字段时间
auto_now_add:创建数据的时候自动更新
BooleanField(Field)
给该字段传布尔值 会对影成 数字0/1
is_delete
is_status
is_vip
TextField(Field)
-文本类型 存储大段文本
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
upload_to = '指定文件路径'
给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
如何自定义char类型字段
from django.db.models import Field class RealCharField(Field): def __init__(self,max_length,*args,**kwargs): self.max_length = max_length # 拦截一个父类的方法 操作完之后 利用super调用父类的方法 super().__init__(max_length=max_length,*args,**kwargs) def db_type(self, connection): return 'char(%s)'%self.max_length class Movie(models.Model): textField = RealCharField(max_length=64)
字段内的关键性参数
null null=True 允许字段为空,必须用null
default 默认参数
django 1.x默认就是级联更新级联删除 django2.x需要你自己手动指定
on_delete = models.CASCADE
db_contraints = True
# 百度
choice参数
用户的性别
学历
婚否
在职状态
客户来源
当你的数据能够被你列举完全 你就可以考虑使用choices参数
models.py
class Userinfo(models.Model): username = models.CharField(max_length=32) gender_choices = ( (1,'男'), (2,'女'), (3,'其他'), ) gender = models.IntegerField(choices=gender_choices) # 该字段还是存数字 并且可以匹配关系之外的数字 record_choices = (('checked','已签到'), ('vacate','请假'), ('noshow','缺勤'), ('leave_early','早退'), ) record = models.CharField('上课记录',choices=record_choices,default='checked',max_length=64)
test.py
user_obj = models.Userinfo.objects.get(pk=1) print(user_obj.username) print(user_obj.gender) # 针对choices参数字段 取值的时候 get_xxx_display() print(user_obj.get_gender_display()) # 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身 user_obj = models.Userinfo.objects.get(pk=4) print(user_obj.gender) # 100 print(user_obj.get_gender_display()) # 100
django自动显示sql命令配置
settings.py文件中加入
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
数据库查询优化(面试会问)
only与defer
only作用
括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性
对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据
但是是重新走的数据库查询吧
defer与only相反
括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性
对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了
# res = models.Book.objects.all() # django orm查询都是惰性查询 # print(res) # res = models.Book.objects.values('title') # print(res) # for r in res: # print(r.title) # res = models.Book.objects.only('title') # 這些對象内部只有title屬性 # # print(res) # for r in res: # # print(r.title) # print(r.price) # 内部会重新遍历,寻找价格 """ only作用 括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性 对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据 但是是重新走的数据库查询吧 """ # res = models.Book.objects.defer('title') # defer与only互为反关系 # for r in res: # print(r.title) """ defer与only相反 括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性 对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了 """