Web开发之django(三ORM)

Django Model里的ORM映射关系总结:一,到目前为止,当咱们的程序涉及到数据库相关操做时,咱们通常都会这么搞:        建立数据库,设计表结构和字段        使用 MySQLdb 来链接数据库,并编写数据访问层代码        业务逻辑层去调用数据访问层执行数据库操做二,django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。1,建立表基本结构:from django.db import modelsclass userinfo(models.Model):name = models.CharField(max_length=30)email = models.EmailField()memo = models.TextField()AutoField(Field) - int自增列,必须填入参数 primary_key=TrueBigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True注:当model中若是没有自增列,则自动会建立一个列名为id的列IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647CharField(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,             # 当删除关联表中的数据时,当前表与其关联的行的行为四,操做表一、基本操做:        # 增        #        # 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()                                                 # 修改单条数据二、进阶操做:利用双下划线将字段和对应的操做链接起来        # 获取个数        #        # 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等于十一、2二、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)三、其余操做        # 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)四、连表操做(了不得的双下划线)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')
相关文章
相关标签/搜索