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')
  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/g-123456/p/6232339.html
Copyright © 2011-2022 走看看