ORM2

1.ORM是什么?

  1.对象关系映射

    类   -->   数据表

    对象 -->    数据行

    属性 -->   字段

2.Django中如何连接数据库.

  1.手动建立一个新的数据库

  2.告诉Django要连接那个数据

    在setting.py文件下连接数据库:

    DATABASES ={

      'default':{

        'ENDING':'django.db.backends.mysql',

        'NAME':'db2',

        'HOST':'127.0.0.1'

        'PORT':3306

        'USER':'root'

        'PASSWORD':'123'  

      }}

  3.在__init__.py下导入pymysql,告诉Django用什么模块连接MySQL

    1.import pymysql

    2.pymysql.install_as_MySQLdb()

  4.在app下的models.py文件中建立类

    类一定要继承models.Model

  5.执行两个命令:

    1.python manage.py makemigrations  -->   查看model.py文件中的内容是否 有变动

    2.python manage.py migrate      -->  把改动的记录翻译成SQL语句,并执行

3.单表的增删改查

  1.查询

    Class.objects.get(条件=值)返回一个对象,查不到,或查到多条都会报错,不推荐使用

    Class.objects.filter(条件=值)

       Class.objects.all()

  2.删.

    Class.objects.get(条件=值).delete()

    Class.objects.get(条件=值).delete()

  3.增

    Class.objects.create(name='值')

  4.改.

    1.基于对象的修改(不推荐)

      class_obj = Class.objects.get(条件=值)

      class_obj.name = '新值'

      class_obj.save()

    2.基于QuerySet的update修改

      Class.objects.filter(条件=值).uodate(name='新值')

4.外键:

  1.一对多建立连接:student = models.ForeignKey(to='Class',on_delete=models.CASCADE)

    1.查询:

      student_obj.student -->ORM中帮我们实现的,直接找到和班级关联的班级对象

      student_obj.student_id  -->数据库中真正保存的字段

    2.外键的修改

      1.student_obj.student = student_obj

        student_obj.save()

      2.student_obj.student_id = 1

        student_obj.save()

  2.多对多建立关联:student = models.ManyToManyField(to='表')

    1.查询:author_obj.book.all()

    2.添加:author_obj.book.add(1,2)

    3.修改:author_obj.book.set([1,2])

    4.删除:author_obj.book.clear()

5.常用字段:

  1.AutoField()  *****

  2.IntegerField()  *****

  3.BooleanField

  4.CharField()  *****

  5.TextField

  6.EmailField

  7.GenericIPAddressField

  8.UUIDField()  *****

  9.FieldField

  10.ImageField

  11.DateTimeField  *****

  12.DateField  *****

  13.TimeField

  14.FloatField

  15.DecimalFeild  *****

  16.SmallIntegerField

  17.PositiveSmallIntegerField

  18.PositiveIntegerField

  19.BigIntegerField

6.常用字段的参数

  1.  null=True     数据库中字段是否可以为空
  2.  default='默认值'
  3.  unique=True 唯一
  4.  primary_key=True 主键     数据库中字段是否为主键
  5.  max_length='数字'
  6.  auto_now=True -->自动把最后更新想时间保存
  7.  auto_now_add=True -->自动把创建时间保存
  8.  db_index=True      -->把数据库中给当前字段创建索引
  9.  db_column='新列名'        数据库中字段的列名
  10.  chioce=(('1,男'),('2,女'),('3,人妖')

  11.  unique_for_date  数据库中字段[日期]部分是否可以建立唯一索引

  12.  unique_for_month  数据库中字段[月]部分是否可以建立唯一索引

  13.  unique_for_year  数据库中字段[年]部分是否可以建立唯一索引

  

  DatetimeField和Datefield独有:

    auto_now_add  -->当前数据的创建时间

    auto_now    --> 当前数据的最后修改时间

7.带choice参数字段

  1.get_字段名_display()

8.建表的云信息

  class Meta:

    db_table = '表名'

    unique_together = (('ip','port'),)

    index_together = (("pub_date","deadline"),)

9.必知必会13条:

  1.返回QuerySet列表类型的

    1.filter()

    2.all()

    3.exclude()

    4.order_by()

    5.reverse()

    6.distinct()

    

    7.values()

    8.values_list()

  2.返回具体对象

    1.get()

    2.first()

    3.last()

  3.返回布尔值

    1.exists()

  4.返回数字的

    1.count()

10.万能的双下划线:

  

models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
 
models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
 
models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
 
models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and
 
类似的还有:startswith,istartswith, endswith, iendswith 

date字段还可以:
models.Class.objects.filter(first_day__year=2017)

 

 

修改管理器(models.py)
导入新的包:from django.db import models
进行模糊查询
开始进行查找前我们先来认识filter()方法。
这是一个过滤器方法用于过滤掉不符合条件的元素。
值得一提的是其内自带方法函数的引用方式为‘__方法名称’。
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
举几个例子:

obj1 = UserInfo.objects.filter(user_name__contains='王')#以‘王’开头的user__name
obj2 = UserInfo.objects.filter(user_name__endswith='王')#以‘王’结尾的user__name
obj3 = UserInfo.objects.filter(id__gte=5)#ID大于等于5的
obj5 = UserInfo.objects.filter(id__exact=5)#id等于5的
obj6 = UserInfo.objects.filter(id__in=[1,3,5])#id等于1,3,5,的
1
2
3
4
5
exclude方法,排除选项。

obj8 = UserInfo.objects.filter(password='123456',id__gt=2).exclude(phone=188)
#找到符合filter的内容后排除phone等于188的,它的另一种写法为
from django.db.models import Q
obj = UserInfo.objects.filter(Q(password='123456') & Q(id__gt=2) & ~Q(phone=188))
1
2
3
4
计算和和最大值:

from django.db.models import Sum,Max,Min
obj = UserInfo.objects.aggregate(Sum('id'))
obj = UserInfo.objects.aggregate(Max('id'))
obj = UserInfo.objects.aggregate(Min('id'))
---------------------
作者:dreamingcrazy
来源:CSDN
原文:https://blog.csdn.net/dreamingcrazy/article/details/82595700
版权声明:本文为博主原创文章,转载请附上博文链接!

    

 

      

 

 

 

 

 

 

 

 

 

 

 

     

posted @ 2018-11-06 16:25  俏如來  阅读(135)  评论(0编辑  收藏  举报