Django-5-model

启动:python manage.py runserver 0.0.0.0:8000 :启动

一、连接数据库并配置

  1. pip install pymysql

  2. 在/jobapp/init.py连接数据库

     import pymysql
     pymysql.install_as_MySQLdb()
    
  3. 在setting中设置

     DATABASES = {
         'default': {
             'ENGINE': 'django.db.backends.sqlite3',
             'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
         }
     }
    

    sqlite:轻量级数据库

    修改为:

     DATABASES = {
         'default': {
             'ENGINE': 'django.db.backends.mysql',
             'NAME': 'jobapp_django', # 要连接的数据库,连接前需要创建好
             'USER': 'root', # 连接数据库的用户名
             'PASSWORD': '123456', # 连接数据库的密码
             'HOST': '127.0.0.1',
             'PORT': '3306',
         }
     }
    

二、ORM 关系对象映射(Object Relational Mapping)

  1. 在models.py中创建类

     from django.db import models
    
     # Create your models here.
     class userinfo(models.Model):
         # 自动创建一个id列,id为主键、自增长
         telephone = models.CharField(max_length=30,unique=True)
         password = models.CharField(max_length=64)
         email = models.EmailField()
    

    自增长: id=models.AutoField(primary_key=True)

  2. 修改配置文件setting.py,告诉应用从哪里应用模块创建

     INSTALLED_APPS = [
         'django.contrib.admin',
         'django.contrib.auth',
         'django.contrib.contenttypes',
         'django.contrib.sessions',
         'django.contrib.messages',
         'django.contrib.staticfiles',
         'user'   #注意这里加上的是模块名称
     ]
    
  3. 执行创建命令: python manage.py makemigrations

    生成临时文件"0001_initial.py"

    该模块下必须有migrations文件夹,且有__init__.py

  4. 执行生成数据表的命令: python manage.py migrate

ps:执行3、4命令时出现错误:

  1. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11

    解决方法:找到最后一行报错的py文件,将下面代码注释掉即可
    py文件为:Python36-32\Lib\site-packages\django\db\backends\mysql\base.py
    if version < (1, 3, 3):
    raise ImproperlyConfigured(“mysqlclient 1.3.3 or newer is required; you have %s” % Database.version)

  2. Django2.2报错 AttributeError: ‘str’ object has no attribute ‘decode’

    解决方法: 出现这个错误之后可以根据错误提示找到文件位置,打开 operations.py 文件。根据错误信息提示,说明 if 语句执行时出错, query 是 str 类型,而 decode() 是用来将 bytes 转换成 string 类型用的,(关于Python编码点这里),由于 query 不需要解码,所以直接将 if 语句注释掉即可
    if query is not None:
    query = query.decode(errors=‘replace’)

三、数据库操作

  1. 增加数据

    models.UserInfo.objects.create(**user) 或 models.UserInfo(**user).save()

    在/user/views.py文件中:

     from . import models
    
     def add(request):
         user={
             "telephone":"13512345678",
             "password":"123456",
             "email":"[email protected]"
         }
         uu = models.UserInfo.objects.create(**user) # 将 user 插入到UserInfo表中,且uu返回数据库中刚加入的那个对象
         # 或者
         obj=models.UserInfo(**user)
         obj.save()
         print(obj.id) # 直接获取刚插入的数据的主键id
         return HttpResponse('user....add.....')
    

    obj.save()中的 force_insert 和 force_update:
    force_insert:都插入 ; force_update:有则更新,没有则不操作

  2. 查询数据

    1. 查询所有数据

       users=models.UserInfo.objects.all() # user不是字典列表,返回的是对象列表
       for u in users:
           print('u为:',u,' , u.id为:',u.id,' , u.telephone为:',u.telephone)
      
       # u为: UserInfo object(1), u.id为: 1, u.telephone为: 13512345678
       # u为: UserInfo object(2), u.id为: 2, u.telephone为: 13512345678
      

      没有则为 []

    2. 获取部分列

       users=models.UserInfo.objects.all().values('id','telephone')
       print(users)
       #             
      
       user_list=models.UserInfo.objects.all().values_list('id','telephone')
       print(user_list)
       # 
      
    3. 条件查询

      单条件

       # select * from userinfo where telephone=110
       res=UserInfo.objects.filter(telephone=110).values()
      

      多条件and

       # select id,telephone from userinfo where telephone=110 and id=10
       res = UserInfo.objects.filter(telephone=110,id=10).values('id', 'telephone')
      
    4. 查找第一个

       res=models.userinfo.objects.filter(telephone='13513211123').first()
      

      没有数据则为 None

    5. 查找个数

       res=models.userinfo.objects.filter(telephone='13512341234').count()
      

      没有则为0

  3. 删除数据

     res=models.userinfo.objects.all().delete()
     res=models.userinfo.objects.filter(id=4).delete()
    
  4. 更新数据

     res=models.userinfo.objects.all().update(password='000000')
     res=models.userinfo.objects.filter(id=4).update(password='qweasd')
    

四、model字段类型和约束

  1. model字段类型

      *'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)',
    
  2. model数据约束

     null                数据库中字段是否可以为空
     db_column           数据库中字段的列名,别名
     db_tablespace
     default             数据库中字段的默认值
     primary_key         数据库中字段是否为主键        
     db_index            数据库中字段是否可以建立索引
     unique              数据库中字段是否可以建立唯一索引
     unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
     unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
     unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
     auto_now_add		该列自动填充系统当前时间(若不给它值,则自动填充)
    

五、查询

  1. 查询条数

     cut=models.UserInfo.objects.all().count()
     return HttpResponse(str(cut))
    
  2. 第一条,字典

     cut = models.UserInfo.objects.all().values().first()
     print(cut)
    
  3. 转换为字典列表

     cut=models.UserInfo.objects.all().values()
     cut=list(cut)
     print(cut)
    
  4. 关系查询

     # 查询 id 大于 1 的
     res=models.UserInfo.objects.filter(id__gt=1).values()
     print(list(res))
    
     # 获取id大于等于1的值
     models.userinfo.objects.filter(id__gte=1)
     # 获取id小于10的值             
     models.userinfo.objects.filter(id__lt=10)
     # 获取id小于10的值
     models.userinfo.objects.filter(id__lte=10)
     # 获取id大于1 且 小于10的值
     models.userinfo.objects.filter(id__lt=10, id__gt=1)
    
     # 不等于
     from django.db.models import Q
     res=models.UserInfo.objects.filter(~Q(id=1)).values()
     print(list(res))
    
  5. in 和 not in

     # 获取id等于11、22、33的数据
     models.UserInfo.objects.filter(id__in=[11, 22, 33])
     # not in 
     models.UserInfo.objects.exclude(id__in=[11, 22, 33])
    
  6. is null

     users=models.userinfo.objects.filter(id__isnull=False) #True
    
  7. contains

     users=models.userinfo.objects.filter(email__contains='admin')
    
     #不区分大小写 icontains        
     users=models.userinfo.objects.filter(email__icontains='admin')
     	
     #不包含        	
     users=models.userinfo.objects.exclude(email__icontains='admin')
    

    这里的不区分大小写和sql语句的不区分大小写都与数据库的排序规则有关:

    数据库中的排序规则用来定义字符在进行排序和比较的时候的一种规则。 常见的如下:

    (1) utf8_general_cs 和 utf8_general_ci (后缀"_cs"或者"_ci"意思是区分大小写和不区分大小写(Case Sensitive & Case Insensitve))

    (2) utf8_bin 规定每个字符串用二进制编码存储,区分大小写,可以直接存储二进制的内容

  8. range: 两边都包含

     users=models.userinfo.objects.filter(id__range=[3,7])
    
  9. endswith startswith 以…开头,以…结尾

  10. order_by()

    res=models.UserInfo.objects.all().order_by('id') # asc
    res=model.UserInfo.objects.all().order_by('-id') # desc
    res=model.UserInfo.objects.all().order_by('-id','telephone') # 以id的desc,telephone的asc
    
  11. group by

    # select password,count(password) as count from UserInfo group by password
    from django.db.models import Count,Min,Max,Sum
    res=models.UserInfo.objects.values('password').annotate(count=Count('password'))
    print(list(res))
    # [{'password': '123456', 'count': 2}, {'password': 'qweqwe', 'count': 2}]
    
  12. limit

    models.Tb1.objects.all()[10:20]
    
  13. regex正则匹配,iregex 不区分大小写

    users=models.userinfo.objects.filter(email__regex=r'_admin')
    
    res=models.UserInfo.objects.filter(email__regex=r'abc').values()
    print(list(res))
    
    # iregex 不区分大小写
    res=models.UserInfo.objects.filter(email__iregex=r'abc').values()
    print(list(res))
    
  14. date

    from datetime import datetime
    models.UserInfo.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
    models.UserInfo.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
    
    models.UserInfo.objects.filter(pub_date__year=2005)
    models.UserInfo.objects.filter(pub_date__year__gte=2005)
    
  15. 原生sql

    https://blog.csdn.net/DeskyAki/article/details/89070360

    from django.db import connection, connections
    cursor = connection.cursor()  # cursor = connections['default'].cursor()
    cursor.execute("SELECT * from user_UserInfo where id = {0}".format(1))
    row = cursor.fetchall()
    print(row)
    

你可能感兴趣的:(Django)