zoukankan      html  css  js  c++  java
  • Web开发之django(三ORM)



    Django Model里的ORM映射关系总结:

    一,到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

    创建数据库,设计表结构和字段
    使用 MySQLdb 来连接数据库,并编写数据访问层代码
    业务逻辑层去调用数据访问层执行数据库操作

    二,django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。
    1,创建表基本结构:
    from django.db import models

    class userinfo(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    memo = models.TextField()

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

    BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True
    注:当model中如果没有自增列,则自动会创建一个列名为id的列

    IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647

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

    TextField(Field) - 文本类型

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

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

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

    null 数据库中字段是否可以为空
    db_column 数据库中字段的列名
    db_tablespace
    default 数据库中字段的默认值
    primary_key 数据库中字段是否为主键
    db_index 数据库中字段是否可以建立索引
    unique 数据库中字段是否可以建立唯一索引
    unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
    unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
    unique_for_year 数据库中字段【年】部分是否可以建立唯一索引

    verbose_name Admin中显示的字段名称
    blank Admin中是否允许用户输入为空
    editable Admin中是否可以编辑
    help_text Admin中该字段的提示信息
    choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
    如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)

    三,连表结构:

    一对多:models.ForeignKey(其他表)
    多对多:models.ManyToManyField(其他表)
    一对一:models.OneToOneField(其他表)

    应用场景:

    一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
    例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
    多对多:在某表中创建一行数据是,有一个可以多选的下拉框
    例如:创建用户信息,需要为用户指定多个爱好
    一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
    例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据

    ForeignKey(ForeignObject) # ForeignObject(RelatedField)
    to, # 要进行关联的表名
    to_field=None, # 要关联的表中的字段名称
    on_delete=None, # 当删除关联表中的数据时,当前表与其关联的行的行为


    四,操作表
    1、基本操作:
    # 增
    #
    # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs

    # obj = models.Tb1(c1='xx', c2='oo')
    # obj.save()

    # 查
    #
    # models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议)
    # models.Tb1.objects.all() # 获取全部
    # models.Tb1.objects.filter(name='seven') # 获取指定条件的数据

    # 删
    #
    # models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据

    # 改
    # models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均支持 **kwargs
    # obj = models.Tb1.objects.get(id=1)
    # obj.c1 = '111'
    # obj.save() # 修改单条数据

    2、进阶操作:
    利用双下划线将字段和对应的操作连接起来

    # 获取个数
    #
    # models.Tb1.objects.filter(name='seven').count()

    # 大于,小于
    #
    # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
    # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
    # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
    # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
    # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值

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

    # isnull
    # Entry.objects.filter(pub_date__isnull=True)

    # contains
    #
    # models.Tb1.objects.filter(name__contains="ven")
    # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
    # models.Tb1.objects.exclude(name__icontains="ven")

    # range
    #
    # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and

    # 其他类似
    #
    # startswith,istartswith, endswith, iendswith,

    # order by
    #
    # models.Tb1.objects.filter(name='seven').order_by('id') # asc
    # models.Tb1.objects.filter(name='seven').order_by('-id') # desc

    # group by
    #
    # from django.db.models import Count, Min, Max, Sum
    # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
    # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

    # limit 、offset
    #
    # models.Tb1.objects.all()[10:20]

    # regex正则匹配,iregex 不区分大小写
    #
    # Entry.objects.get(title__regex=r'^(An?|The) +')
    # Entry.objects.get(title__iregex=r'^(an?|the) +')

    # date
    #
    # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
    # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

    # year
    #
    # Entry.objects.filter(pub_date__year=2005)
    # Entry.objects.filter(pub_date__year__gte=2005)

    # month
    #
    # Entry.objects.filter(pub_date__month=12)
    # Entry.objects.filter(pub_date__month__gte=6)

    # day
    #
    # Entry.objects.filter(pub_date__day=3)
    # Entry.objects.filter(pub_date__day__gte=3)

    # week_day
    #
    # Entry.objects.filter(pub_date__week_day=2)
    # Entry.objects.filter(pub_date__week_day__gte=2)

    # hour
    #
    # Event.objects.filter(timestamp__hour=23)
    # Event.objects.filter(time__hour=5)
    # Event.objects.filter(timestamp__hour__gte=12)

    # minute
    #
    # Event.objects.filter(timestamp__minute=29)
    # Event.objects.filter(time__minute=46)
    # Event.objects.filter(timestamp__minute__gte=29)

    # second
    #
    # Event.objects.filter(timestamp__second=31)
    # Event.objects.filter(time__second=2)
    # Event.objects.filter(timestamp__second__gte=31)

    3、其他操作
    # extra
    #
    # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
    # Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
    # Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
    # Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    # Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

    # F
    #
    # from django.db.models import F
    # models.Tb1.objects.update(num=F('num')+1)


    # Q
    #
    # 方式一:
    # Q(nid__gt=10)
    # Q(nid=8) | Q(nid__gt=10)
    # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    # 方式二:
    # con = Q()
    # q1 = Q()
    # q1.connector = 'OR'
    # q1.children.append(('id', 1))
    # q1.children.append(('id', 10))
    # q1.children.append(('id', 9))
    # q2 = Q()
    # q2.connector = 'OR'
    # q2.children.append(('c1', 1))
    # q2.children.append(('c1', 10))
    # q2.children.append(('c1', 9))
    # con.add(q1, 'AND')
    # con.add(q2, 'AND')
    #
    # models.Tb1.objects.filter(con)


    4、连表操作(了不起的双下划线)

    user_info_obj = models.UserInfo.objects.get(name=u'武沛齐')
    user_info_objs = models.UserInfo.objects.all()

    group_obj = models.UserGroup.objects.get(caption='CEO')
    group_objs = models.UserGroup.objects.all()

    # 添加数据
    # group_obj.user_info.add(user_info_obj)
    # group_obj.user_info.add(*user_info_objs)

    # 删除数据
    # group_obj.user_info.remove(user_info_obj)
    # group_obj.user_info.remove(*user_info_objs)

    # 添加数据
    # user_info_obj.usergroup_set.add(group_obj)
    # user_info_obj.usergroup_set.add(*group_objs)

    # 删除数据
    # user_info_obj.usergroup_set.remove(group_obj)
    # user_info_obj.usergroup_set.remove(*group_objs)

    # 获取数据
    # print group_obj.user_info.all()
    # print group_obj.user_info.all().filter(id=1)

    # 获取数据
    # print user_info_obj.usergroup_set.all()
    # print user_info_obj.usergroup_set.all().filter(caption='CEO')
    # print user_info_obj.usergroup_set.all().filter(caption='DBA')
  • 相关阅读:
    Freemarker空值判断
    php集成开发环境IDE
    mysql卸载
    Apache网站根目录
    冒泡排序
    线程操作
    通过滚轮改变图片大小
    Timer计时器
    写异常日志
    异常处理
  • 原文地址:https://www.cnblogs.com/g-123456/p/6232339.html
Copyright © 2011-2022 走看看