Django之模型层

目录:

queryset对象有create,update,delete方法

表模型对象,有save,delete方法

 *操作mysql步骤:

  • 手动创建数据库
  • 在django内models文件内创建类
from django.db import models

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64)
    pub_data = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish = models.CharField(max_length=12)
    def __str__(self):
        return self.name
  • 更多字段
    • 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
      
          自定义无符号整数字段
      
              class UnsignedIntegerField(models.IntegerField):
                  def db_type(self, connection):
                      return 'integer UNSIGNED'
      
              PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
                  'AutoField': 'integer AUTO_INCREMENT',
                  'BigAutoField': 'bigint AUTO_INCREMENT',
                  'BinaryField': 'longblob',
                  'BooleanField': 'bool',
                  'CharField': 'varchar(%(max_length)s)',
                  'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
                  'DateField': 'date',
                  'DateTimeField': 'datetime',
                  'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
                  'DurationField': 'bigint',
                  'FileField': 'varchar(%(max_length)s)',
                  'FilePathField': 'varchar(%(max_length)s)',
                  'FloatField': 'double precision',
                  'IntegerField': 'integer',
                  'BigIntegerField': 'bigint',
                  'IPAddressField': 'char(15)',
                  'GenericIPAddressField': 'char(39)',
                  'NullBooleanField': 'bool',
                  'OneToOneField': 'integer',
                  'PositiveIntegerField': 'integer UNSIGNED',
                  'PositiveSmallIntegerField': 'smallint UNSIGNED',
                  'SlugField': 'varchar(%(max_length)s)',
                  'SmallIntegerField': 'smallint',
                  'TextField': 'longtext',
                  'TimeField': 'time',
                  'UUIDField': 'char(32)',
      
          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
       
      如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.
       
      (1)blank
       
      如果为True,该字段允许不填。默认为False。
      要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
      如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
       
      (2)default
       
      字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
       
      (3)primary_key
       
      如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
      Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
      否则没必要设置任何一个字段的primary_key=True。
       
      (4)unique
       
      如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
       
      (5)choices
      由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。
      
      参数
      参数
  • setting文件配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'chuck',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': 3306,
    }
}
  • 在app文件夹下__init__.py中引入pymysql
import pymysql
pymysql.install_as_MySQLdb()
  • 完成数据库迁移
python manage.py makemigrations
python manage.py migrate

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

一:单表操作

增加,删,改:两种方式:queryset对象的方法,book对象的方法
queryset=models.Book.objects.filter(pk=2) --queryset对象
book=models.Book.objects.filter(pk=2).first() --book对象

增加(create或save)

date类型,传的时候,可以传字符串(格式必须是:2018-06-17),可以传时间对象
ret=models.Book.objects.create(name='洪流吗',price=23.7,publish='北京出版社',pub_data='2018-06-17')

import datetime ctime=datetime.datetime.now() ret=models.Book.objects.create(name='西游记',price=45.9,publish='南京出版社',pub_data=ctime)
生成对象,再调save方法 book
=models.Book(name='三国演义',price=46.89,publish='南京出版社',pub_data='2017-08-17') book.save()

删除(先查后删delete)

ret=models.Book.objects.filter(pk=1).delete()  --pk指主键
book
=models.Book.objects.filter(pk=1).first() book.delete()

更新(update或save)

ret = models.Book.objects.filter(pk=2).update(name='ddd')
book
=models.Book.objects.filter(pk=2).first() book.name='XXX' # 没有update这个方法的 # book.update() # 既可以保存,又可以更新 book.save()
get方法 book
= models.Book.objects.filter(pk=2).first() # book拿到的是 book对象 #get查到的数据有且只有一条,如果多,少,都抛异常 book=models.Book.objects.get(name='XXX')
print(book.name)

(一):单表查询(基于对象,双下划线)

 --

注意:

必须是queryset对象才有query,它就是原生的sql;
print(book.query)

多个参数之间用‘,’连接,关系为and

单表查询API:

<1> all():                  查询所有结果
   book=models.Book.objects.all()
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含与所给筛选条件不匹配的对象,exclude = 排除 <5> order_by(*field): 对查询结果排序('-id'),取负号即反转 <6> reverse(): 对查询结果反向排序,必须在order_by之后才能调用。
   book=models.Book.objects.order_by('price').reverse()
<8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
   book=models.Book.objects.all().count()
<9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后不是一系列model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录

   单表基于双下划线的模糊查询

price__in:__前为字段名,后为对应方法;
Book.objects.filter(price__in=[100,200,300]) --在列表范围内 Book.objects.filter(price__gt=100) --大于 Book.objects.filter(price__lt=100) --小于 Book.objects.filter(price__gte=100) --大于等于 Book.objects.filter(price__lte=100) --小于等于 Book.objects.filter(price__range=[100,200]) --在100-200之间 Book.objects.filter(title__contains="python") --包含Python Book.objects.filter(title__icontains="python") --包含Python且区分大小写 Book.objects.filter(title__startswith="py") --以py开头 Book.objects.filter(pub_date__year=2012) --获取对应年份,月,日数据

 

 

 

三:在Python脚本中调用Django环境

#不需用启动django程序,可以直接执行sql
import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
    import django
    django.setup()

    from app名 import models

    books = models.Book.objects.all()
    print(books)

四:Django终端打印SQL语句

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

五:常用(非常用)字段和参数

 

六:Django-model进阶

 

posted @ 2019-01-10 18:46  ChuckXue  阅读(166)  评论(0)    收藏  举报