一、字段

  常用字段:

  1. AutoField:int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
  2. IntergerField:一个整数类型,范围在 -2147483648 to 2147483647。
  3. CharField:字符类型,必须提供max_length参数, max_length表示字符长度。
  4. DateField:日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。
  5. DateTimeField:日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
 AutoField(Field)
         - int自增列,必须填入参数 primary_key=True

     BigAutoField(AutoField)
         - bigint自增列,必须填入参数 primary_key=True

         注:当model中如果没有自增列,则自动会创建一个列名为id的列
         from django.db import models

         class UserInfo(models.Model):
             # 自动创建一个列名为id的且为自增的整数列
             username = models.CharField(max_length=32)

         class Group(models.Model):
             # 自定义自增列
             nid = models.AutoField(primary_key=True)
             name = models.CharField(max_length=32)

     SmallIntegerField(IntegerField):
         - 小整数 -32768 ~ 32767

     PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
         - 正小整数 0 ~ 32767
     IntegerField(Field)
         - 整数列(有符号的) -2147483648 ~ 2147483647

     PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
         - 正整数 0 ~ 2147483647

     BigIntegerField(IntegerField):
         - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

     BooleanField(Field)
         - 布尔值类型

     NullBooleanField(Field):
         - 可以为空的布尔值

     CharField(Field)
         - 字符类型
         - 必须提供max_length参数, max_length表示字符长度

     TextField(Field)
         - 文本类型

     EmailField(CharField):
         - 字符串类型,Django Admin以及ModelForm中提供验证机制

     IPAddressField(Field)
         - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

     GenericIPAddressField(Field)
         - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
         - 参数:
             protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
             unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

     URLField(CharField)
         - 字符串类型,Django Admin以及ModelForm中提供验证 URL

     SlugField(CharField)
         - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

     CommaSeparatedIntegerField(CharField)
         - 字符串类型,格式必须为逗号分割的数字

     UUIDField(Field)
         - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

     FilePathField(Field)
         - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
         - 参数:
                 path,                      文件夹路径
                 match=None,                正则匹配
                 recursive=False,           递归下面的文件夹
                 allow_files=True,          允许文件
                 allow_folders=False,       允许文件夹

     FileField(Field)
         - 字符串,路径保存在数据库,文件上传到指定目录
         - 参数:
             upload_to = ""      上传文件的保存路径
             storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

     ImageField(FileField)
         - 字符串,路径保存在数据库,文件上传到指定目录
         - 参数:
             upload_to = ""      上传文件的保存路径
             storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
             width_field=None,   上传图片的高度保存的数据库字段名(字符串)
             height_field=None   上传图片的宽度保存的数据库字段名(字符串)

     DateTimeField(DateField)
         - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

     DateField(DateTimeCheckMixin, Field)
         - 日期格式      YYYY-MM-DD

     TimeField(DateTimeCheckMixin, Field)
         - 时间格式      HH:MM[:ss[.uuuuuu]]

     DurationField(Field)
         - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

     FloatField(Field)
         - 浮点型

     DecimalField(Field)
         - 10进制小数
         - 参数:
             max_digits,小数总长度
             decimal_places,小数位长度

     BinaryField(Field)
         - 二进制类型

 字段合集

全部字段

二、字段参数

  1. null:用于表示某个字段可以为空。
  2. unique:如果设置为unique=True 则该字段在此表中必须是唯一的 。
  3. db_index:如果db_index=True 则代表着为此字段设置数据库索引。
  4. default:为该字段设置默认值。

  时间字段独有:auto_now_add、auto_now

三、关系字段

  1. 一对多外键字段
  2. 一对一关系字段
  3. 多对多关系字段

四、查询

  1、基于对象查询(子查询)

 models.Books.objects.filter(name=xxx).first() #正向查询
 models.Publish.objects.filter(book_set=1).first()  #反向查询 

  2、基于querySet和双下划线查询(join查询)

 models.Books.objects.filter(name=xxx).values("publish__name")   #正向查询
 models.Publish.objects.filter(book__name=xxx).values("name")   #反向查询

  3、聚合分组

  (1)聚合

 from django.db.models. import Sum,Count,Avg
 models.Book.objects.all().aggregate(price_sum=Sum("price"))   #返回一个字典

  (2)分组

 #单表分组models.Book.objects.values("name").annocate(c=Count("id"))    #按什么分组,values里就是什么

 #跨表分组
 #select dep.name,Count(*) from emp inner join dep group by dep.id,dep.name

 models.dep.objeects.values("name").annotate(c=Count("emp__name")).values("name","c")
 models.emp.objects.values("dep__name").annotate(c=Count("name")).values("name","c")
 #.annotate()前面的values()里是什么,就按什么分组

  4、F查询和Q查询

  (1)F查询

 from django.db.models import F
 from app01.models import Book

 Book.objects.update(price=F("price")+20)  # 对于book表中每本书的价格都在原价格的基础上增加20元

  (2)Q查询

  | 表示或者,& 表示和

 from django.db.models import Q

 print(Book.objects.filter(Q(id=3))[0])  # 因为获取的结果是一个QuerySet,所以使用下标的方式获取结果
 print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0])  # 查询id=3或者标题是“Go”的书
 print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J")))  # 查询价格大于等于70并且标题是“J”开头的书
 print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3)))  # 查询标题是“J”开头并且id不是3的书
 print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26"))  # Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面

  另一种方式

 q = Q()
 q.connector = "or"
 q.children.append(("))  #以元祖的形式
 q.children.append(("))

 models.Books.objects.all().filter(q)

 q = Q()
 q.connectior = "and"
 q.children.append(("))  #以元祖的形式
 q.children.append(("))

 models.Books.objects.all().filter(q)

五、知识点

  Book._meta.app_label拿到模型表所在app的名称

  Book._meta.model_name拿到“book”这个字符串

六、Content-Type表

  https://blog.csdn.net/aaronthon/article/details/81714496

  

        组件的作用:可以通过两个字段让表和N张表创建FK关系

        表结构:
            from django.db import models
            from django.contrib.contenttypes.models import ContentType

            from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation

            class DegreeCourse(models.Model):
                """学位课程"""
                name = models.CharField(max_length=128, unique=True)
                course_img = models.CharField(max_length=255, verbose_name="缩略图")
                brief = models.TextField(verbose_name="学位课程简介", )

            class Course(models.Model):
                """专题课程"""
                name = models.CharField(max_length=128, unique=True)
                course_img = models.CharField(max_length=255)

                # 不会在数据库生成列,只用于帮助你进行查询
                policy_list = GenericRelation("PricePolicy")

            class PricePolicy(models.Model):
                """价格与有课程效期表"""
                content_type = models.ForeignKey(ContentType)  # 关联course or degree_course
                object_id = models.PositiveIntegerField()

                #不会在数据库生成列,只用于帮助你进行添加和查询
                content_object = GenericForeignKey('content_type', 'object_id')

                valid_period_choices = (
                    (1, '1天'),
                    (3, '3天'),
                    (7, '1周'), (14, '2周'),
                    (30, '1个月'),
                    (60, '2个月'),
                    (90, '3个月'),
                    (180, '6个月'), (210, '12个月'),
                    (540, '18个月'), (720, '24个月'),
                )
                valid_period = models.SmallIntegerField(choices=valid_period_choices)
                price = models.FloatField()

        使用:
            # 1.在价格策略表中添加一条数据
            # models.PricePolicy.objects.create(
            #     valid_period=7,
            #     price=6.6,
            #     content_type=ContentType.objects.get(model='course'),
            #     object_id=1
            # )

            # models.PricePolicy.objects.create(
            #     valid_period=14,
            #     price=9.9,
            #     content_object=models.Course.objects.get(id=1)
            # )

            # 2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
            # price = models.PricePolicy.objects.get(id=2)
            # print(price.content_object.name) # 自动帮你找到

            # 3.找到某个课程关联的所有价格策略
            # obj = models.Course.objects.get(id=1)
            # for item in obj.policy_list.all():
            #     print(item.id,item.valid_period,item.price)

七、values / value_list / only

  values取出来是以列表形式存储在queryset中。

  value_list取出来是以元祖形式存储在queryset中。

  only是以对象的形式存储在queryset中。

Django之Model的更多相关文章

  1. Django之Model操作

    Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ...

  2. Django的Model上都有些什么

    Django的Model上都有些什么 modelinfo= ['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__' ...

  3. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  4. django User model

    django User model operation this tutorial will guide us to know how to manipulate django User model. ...

  5. Scrapy中使用Django的Model访问数据库

    Scrapy中使用Django的Model进行数据库访问 当已存在Django项目的时候,直接引入Django的Model来使用比较简单 # 使用以下语句添加Django项目的目录到path impo ...

  6. django使用model创建数据库表使用的字段

    Django通过model层不可以创建数据库,但可以创建数据库表,以下是创建表的字段以及表字段的参数.一.字段1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一 ...

  7. Django之Model组件

    Model组件在django基础篇就已经提到过了,本章介绍更多高级部分. 一.回顾 1.定义表(类) ##单表 from django.db import models class user(mode ...

  8. django中将model转换为dict的方法

    django中将model转换为dict的方法 from django.forms.models import model_to_dict from user.model import userpro ...

  9. Python学习---django之Model语法180124

    django之Model语法[Models] 1    django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使 ...

  10. Django的model查询操作 与 查询性能优化

    Django的model查询操作 与 查询性能优化 1 如何 在做ORM查询时 查看SQl的执行情况 (1) 最底层的 django.db.connection 在 django shell 中使用 ...

随机推荐

  1. Java MultipartFile 使用记录

    private void file(String path,MultipartFile file){ String separator = "/"; String originFi ...

  2. 012_call和apply区别

    一. function fn(a,b) { console.log(this); } fn.call(null,1,2); //call为参数方式 fn.apply(null,[1,2]); //ap ...

  3. volatile分析

    volatile三大特性: 1. 内存可见性 2.不保证原子性 3. 禁止重排序内存屏障的概念:memory barrier是一个CPU指令.指令逻辑:a.确保一些特定操作执行顺序 b.影响一些数据的 ...

  4. C++ cmake

    cmake_minimum_required(VERSION 2.8) project(helloworld) option add_exectuable 告诉工程生成一个可执行文件. add_lib ...

  5. 基于 HTML5 的工业互联网云平台监控机房 U 位

    前言 机柜 U 位管理是一项突破性创新技术--继承了 RFID 标签(电子标签)的优点的同时,完全解决了 RFID 技术(非接触式的自动识别技术)在机房 U 位资产监控场应用景中的四大缺陷,采用工业互 ...

  6. C++ 中 auto 与 decltype 的用法与区别

    最近在恶补 C++ 知识的时候,学习到了一些 C++11 标准的新特性,利用这些新特性,我们能够更快地提高编程效率,从而实现我们的目标,在此特意记下学习过程中所学习到的一些东西,方便日后的回顾和复习. ...

  7. 工具(3): 转换Excel表格到MarkDown:exceltk

    源码和下载: 0.1.3 mac: https://github.com/fanfeilong/exceltk/blob/master/pub/exceltk.0.1.3.pkg windows: h ...

  8. MySQL 8.0.x for Windows 解压缩版配置安装

    一.官网下载MySQL8.0.16 直达官网下载Community版:https://dev.mysql.com/downloads/mysql/ 然后拉倒下方点击对应版本位数下载 二.创建my.in ...

  9. Shell命令-文件压缩解压缩之gzip、zip

    文件及内容处理 - gzip.zip 1.gzip:gzip压缩工具 gzip命令的功能说明 gzip 命令用于压缩文件.gzip 是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出 .gz ...

  10. UIAutomator简介

    简介 Android 4.3发布的时候包含了一种新的测试工具–uiautomator,uiautomator是用来做UI测试的.也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期.比如 ...