• [oldboy-django][2深入django]ORM操作


    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html

    需求: 汇总django orm操作,代替原生mysql语句来操作数据库;里面内容包含:

      创建单表,多对一表,多对多表;

      如何在django配置mysql;

      操作数据行(单表增删改查, 联表查询,django查询高级操作,以及django如何使用原生sql语句进行查询)

      

     1 创建数据库表(单表,多对一表) + 配置文件

    3  django的ORM(不能创建数据库,要先创建数据库)
        步骤:
    
        1 手工创建数据库day3db
    
        2 修改django连接数据库mysql, 默认连接的数据库是sqlite
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': 'day3db',
                    'USER': 'root',
                    'PASSWORD': '',
                    'HOST': '127.0.0.1',
                    'PORT': '3306',
                }
            }
    
    
        3 使用Pymysql连接mysql, 默认连接mysql的接口是MySQLdb
            在day3里面的init.py增加以下内容:
            import pymysql
            pymysql.install_as_MySQLdb()
    
    
        4 在app01 models.py里面添加以下内容创建表UserInfo
            class UserInfo(models.Model):
            nid = models.AutoField(primary_key=True) # 自增列可以不用写
            username = models.CharField(max_length=128)
            password = models.CharField(max_length=64)
    
    
        5 注册app01应用 在settings.py修改
            INSTALLED_APPS = [
                'django.contrib.admin',
                'django.contrib.auth',
                'django.contrib.contenttypes',
                'django.contrib.sessions',
                'django.contrib.messages',
                'django.contrib.staticfiles',
                'app01'
            ]
    
        6 运行以下两个命令:必须在工程目录()
            python manage.py makemigrations
            python manage.py migrate
    
    
        7 创建表 (在models.py里面修改)
             记住最后都要执行命令:python manage.py makemigrations; python manage.py migrate)
             - 创建单表(UserInfo, Group)
                    class UserInfo(models.Model):
                        nid = models.AutoField()
                        username = models.CharField(max_length=128)
                        password = models.CharField(max_length=64)
                        ug = models.ForeignKey('Group', null=True)
                        #ug是一个对象,可以访问ug_id, ug_title ,id, title都是Group的字段
    
                    class Group(models.Model):
                        title = models.CharField(max_length=64)
    
             - 创建多对一关系表
                    class UserInfo(models.Model):
                        .....
                        # 增加一行代码
                        ug = models.ForeignKey('Group', null=True)
    
             - ps:
                python manage.py makemigrations 作用:
                    读取app01目录下的migrations最新的py(有按序列),并和models.py里面的类进行比较
                    得到一个新的py, 并存储在migration里面
    
                python manage.py migrate作用:
                    根据migrations里面最新的py,将其操作翻译成sql语句,进行数据库表操作
    
        8 修改数据表
            - 修改字段名字
                class UserInfo(models.Model):
                    nid = models.AutoField()
                    uname = models.CharField(max_length=128)
                    password = models.CharField(max_length=64)
    
            - 增加一列(数据表可能有数据,所以新增列一定要确保有数据或者允许为空)
                class UserInfo(models.Model):
                    nid = models.AutoField()
                    uname = models.CharField(max_length=128)
                    password = models.CharField(max_length=64)
                    age = model.IntegerField(default=20)
    
            - 删除一列:注释掉
    View Code

    2 简单操作数据行(单表)

    9 操作数据行(是在视图函数views里面执行)-- 类对象
            - 增(插入数据行)
                from app01 import models
                obj = models.Group.objects.create(title="公关部")
                # obj为刚刚插入的数据对象
                obj = models.UserInfo.objects.create(username="alex", password="123",age=12,ug_id=1)
    
    
            - 单表查
                a.查所有
                    models.Group.objects.all() # 查询所有,
                    #得到的类型为QuerySet,可以理解成列表,里面的元素为对象(一行数据),
                b.条件查询
                    # 结果类型为QuerySet
                    where title="公关部"
                        models.Group.objects.filter(title="公关部")
                    where id > 1
                        models.Group.objects.filter(id__gt=2)
                        # 双下划线
                    where id < 3
                        models.Group.objects.filter(id__lt=3)
    
                c.删除(得先找到)
                    models.Group.objects.filter(id__lt=3).delete()
    
                d.更新(得先找到)
                    models.Group.objects.filter(id=3).update(title="测试部")
    View Code

    3  多对一联表

    2 orm补充 -- 跨表查询
        - 多对一(连表查询) left join on
    
            a.正向跨表  user.ut.title
                - all
                    user_list = models.UserInfo.objects.all()
                    for user in user_list:
                       print(user.id, user.name, user.age, user.ut_id, user.ut.title)
    
                - values
                    result = models.UserInfo.objects.filter(id__gt=2).values('name', 'age''ut__title')
                    for row in result:
                        print(row['name'],row['ut__title'])
    
                - value_list
                    result = models.UserInfo.objects.filter(id__gt=2).value_list('name', 'age''ut__title')
                    for row in result:
                        print(row[0],row[2])
    
            b.反向跨表 表名小写__title
                - all
                    obj = models.UserType.objects.all().first()
                    result = obj.userinfo_set.all()
    
                - values
                    models.UserType.objects.values('id', 'name', 'userinfo__title')
                    models.UserType.objects.values('id', 'name', 'userinfo') # 拿到userinfo的id
    
            c.获取多个数据时,数据类型(三种)
                #1 [obj,obj,...]
                   models.UserInfo.objects.all()
                   models.UserInfo.objects.filter(id__gt=2)
    
                #2 [字典,字典] ,只取特定的字段name, age
                    [{'name': 'alex', age:12}, {'name':'lzp', age:22}]
                   models.UserInfo.objects.all().values('name','age')
                   result = models.UserInfo.objects.filter(id__gt=2).values('name','age')
                   for item in result:
                        print(item['name'])
    
                #3 values跨表
                    result = models.UserInfo.objects.filter(id__gt=2).values('name', 'age''ut__title')
                    for row in result:
                        print(row['name'],row['ut__title'])
    
                #4 [元组,元组]
                    [('alex', 12), ('lzp', 22)]
                    models.UserInfo.objects.all().value_list('name', 'age')
                    models.UserInfo.objects.filter(id__gt=2).value_list('name','age')
    
                #5 values_list的跨表查询
                    models.UserInfo.objects.filter(id__gt=2).values_list('name', 'age', 'ut__title', 'ut_id')
            ps 其他
                models.UserInfo.objects.all()
                models.UserInfo.objects.all().count()
                models.UserInfo.objects.all().first()
                models.UserInfo.objects.all()[1:20]
    
                models.UserInfo.objects.filter(id__lt=10, id__gt=2)
    
                models.UserInfo.objects.all().update(title="dd")
                models.UserInfo.objects.all().delete()
    
                跨表:
                    - 正向
                        models.UserInfo.objects.filter('ut__title'='超级用户').values('id', 'name', 'ut__title')
                    - 反向
                        models.UserType.objects.filter('userinfo__name'='alex2').values('id','title','userinfo__age')
    View Code

    4 django高级操作 (补充first, last)

       - 基本操作
            1 count() 获取总数
            2 排除exclude
                models.UserInfo.objects.exclude(id=1) # where id !=1
            3 大于小于
                filter(id__gt=1)
                filter(id__lt=1)
                filter(id__lte=1)
                filter(id__gt=2,id__lt=10) 且的关系
            4 in
                filter(id__in[1,2,3])
            5 not in
                exclude(id__in[1,2,3])
            6 like
                filter(name__contains='alex')
                filter(name_icontains='alxe') # 大小写不敏感
            7 not like
                exclude(name_contains='alex')
            8 between and
                filter(id_range=[1,10])
            9 startswith, endswith, istartswith, iendswith
        - 排序
            models.UserInfo.objects.all().order_by('id')
            models.UserInfo.objects.all().order_by('-id')
            models.UserInfo.objects.all().order_by('id','-name')
    
        - 分组
            from django.db.models import Avg, Max, Min, Sum
            models.UserInfo.objects.values('ut_id').annotate(avg_age=Avg('age'))
            models.UserInfo.objects.filter(id__gt=2).values('ut_id').annotate(avg_age=Avg('age'))
            models.UserInfo.objects.filter(id__gt=2).values('ut_id').annotate(avg_age=Avg('age')).filter(avg_age__gt=20)
    
        - F 取字段原来的值
            from django.db.models import F
            models.UserInfo.objects.all().update(age=F('age') + 1)
        - Q
            组合复杂的and, or 条件
    
        - extra  额外的查询
            # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
            a. 映射:增加一列
                models.UserInfo.objects.extra(
                    select={'new_id': select count(1) from app01_UserType where id > %s },
                    select_params=[1,]
                )
                Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
    
            b. 条件,增加条件
                models.UserInfo.objects.extra(
                    where=["app01_UserInfo.id > %s"],
                    params=[10,]
                )
                Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
                Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    
            c.排序
                models.UserInfo.objects.extra(
                    order_by=['-app01_userinfo.age']
                )
    
            d. 笛卡尔积tables
                models.UserInfo.objects.extra(
                    tables=['app01_usertype']
                )
    
            f. 所有都用上
                Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
    
    
    
    
        - distinct
            result = models.UserInfo.objects.distinct('id')
            #去重,将相同id列折成一条记录(一行)
    
        - only
            result =  models.UserInfo.object.all().only('id','name')
            只取id和name两列, 但是result数据类型还是[obj,obj,..]
        - defer
            result = models.UserInfo.objects.all().defer('name''age')
            取除了name,age的列,[obj,obj,...]
    
        - using(很重要)
            models.UserInfo.objects.all().using('default') # 表示使用哪个数据库,进行查询
            models.UserInfo.objects.all().using('db2')
    
    
                DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.sqlite3',
                        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
                    },
                     'db2': {
                        'ENGINE': 'django.db.backends.sqlite3',
                        'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
                        # 注意,这里也要改成db2,而且这里的所有数据库都要设成相同的引擎
                    },
    
                }
        - 批量插入数据bulk_create
            obj_list = [
                        models.UserType(title="公共部"),
                        models.UserType(title="测试部"),
                        models.UserType(title="女工部"),
                        ]
            models.UserType.objects.bulk_create(obj_list, 10)
            # 10表示插入10行数据,就commit一次,如果有100行,就需要commit10次;改值不能大于999
    
        - dates
            dates(self, field_name, kind, order='ASC')
            其中kind的值只能是
                year, 年-01-01
                month, 年-月-01
                day, 年-月-日
            models.UserInfo.objects.dates('time_row', 'day', 'DESC')
    
        - datetime
            def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
            # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
            # kind只能是 "year", "month", "day", "hour", "minute", "second"
            # order只能是:"ASC"  "DESC"
            # tzinfo时区对象
            models.UserInfo.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
            models.UserInfo.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
    
                """
                pip3 install pytz
                import pytz
                pytz.all_timezones
                pytz.timezone(‘Asia/Shanghai’)
                """
    
        - reverse 前面必须是order_by
            models.UserInfo.objects.order_by('ut_id', '-age').reverse()
            等效于:
            models.UserInfo.objects.order_by('-ut_id','age')
    View Code

    5 django使用原生sql查询

        - 原生sql语句
            import pymysql
            from django.db import connection, connections
            # cursor = connection.cursor(cursor=pymysql.cursors.DictCursor) # 这个表示连接的是settings里面设置default数据库
            cursor = connections['default'].cursor(cursor=pymysql.cursors.DictCursor)
            cursor.execute('select id, title from app01_usertype where id > %s', [1,])
            result = cursor.fetchall()
            print(result)
    View Code

     6 补充 字典形式查询更新插入 + isnull查询

        - 补充
            - 增加,数据行的另外一种较好的模式(适合字段非常多的场景)
                dict = {'name': 'alex', 'age':22, 'ut_id':2}
                models.UserInfo.objects.creat(**dict)
            - 更新,数据行的另外一种模式
                dict = {}
                models.UserInfo.objects.filter(id__gt=2).update(**dict)
    
            - 查询,而且条件是并且的关系
                dict = {'name': 'axle', 'age':18}
                models.UserInfo.objects.filter(**dict)
    
            PS: 前提是django能够将用户提交的数据转换成字典,
                django的Form组件实现: 用户请求数据规则验证 + 将数据转换成字典
    
      - isnull
        
        models.UserInfo.objects.filter(age__isnull=True)
    View Code

     7 补充多字段时,字典格式添加,修改

            - 增加,数据行的另外一种较好的模式(适合字段非常多的场景)
                dict = {'name': 'alex', 'age':22, 'ut_id':2}
                models.UserInfo.objects.create(**dict)
            - 更新,数据行的另外一种模式
                dict = {}
                models.UserInfo.objects.filter(id__gt=2).update(**dict)
    
            - 查询,而且条件是并且的关系
                dict = {'name': 'axle', 'age':18}
                models.UserInfo.objects.filter(**dict)
    
            PS: 前提是django能够将用户提交的数据转换成字典,
                django的Form组件实现: 用户请求数据规则验证 + 将数据转换成字典
    View Code

    8 补充联表操作,如何提高效率

            - select_related 提高联表的效率之一(有做联表查询,相对而言,发送的请求少了)
                  1 原来的联表
                       q =  models.UserInfo.objects.all()  # 此时还没有连表
                       for row in q:
                           print(row.ut.title)  # 此时才做联表,会再一次数据库查询,
                       执行的查询次数 = 1 + len(q)
    
                  2 第一次查询的时候主动做连表
                       q = models.UserInfo.objects.all().select_related('ut')  # 一次就连表,将数据查询
                       等效: select * from UserInfo inner join UserType on ...
    
                       q = models.UserInfo.objects.all().select_related('ut', 'gp')
                       # UserInfo有两个foreignKey : ut, gp
    
            - prefetch_selected 提高联表的效率之二 (数据较多的时候推荐用这个,因为连表查询效率低)
                       models.UserInfo.objects.prefetch_related('ut')
                       -- 会执行两个sql(没有做连表查询)
                       -- select * from UserInfo; 然后将ut_id去重, ut_id = [2,4]
                       -- select * from UserType where id in [2,4]
    
            - values 提高联表的效率之三 (一开始就连表,和select_related是等效的,只是row是字典,而select_related是对象)
                result = models.UserInfo.objects.values('ut__title', 'name')
                for row in result:
                    print(row['name'],row['ut__title']
    
            - 使用foreignKey优缺点
                    好处: 约束, 和节省硬盘的空间(使用整形数据代替较长的字符串)
                    缺点; 速度慢,
                    所以大公司:不有联表(设计上,不用连表,不是查询的时候),以空间换速度(硬盘没那么值钱)
    View Code

    9 补充多对多ORM

        - 多对多的ORM ManyToMany
            男生表和女生表进行相亲大会, 需要建三张表:男生表,女生表,相亲关系表
    
            1 自建第三张表,并设置联合唯一索引
    
                class Boy(models.Model):
                    name = models.CharField(max_length=32)
    
                class Girl(models.Model):
                    name = models.CharField(max_length=32)
    
                class Love(models.Model):
                    b = models.ForeignKey('Boy')
                    g = models.ForeignKey('Girl')
    
                    # b 和 g是联合唯一索引
                    class Meta:
                        unique_together = [
                            ('b', 'g'),
                        ]
    
                 -  查询和方少伟相过亲的女生
                    result = models.Love.objects.filter(b__name="方少伟").values('g__name')
    
            2 django自动帮我们创建
    
                class Boy(models.Model):
                    name = models.CharField(max_length=32)
                    m = models.ManyToManyField('Girl',through='Love', through_fields=('b', 'g'))
    
                    #在boy表添加一行:m = models.MannyToManyField('Girl')
                    # 不会在boy添加任何一列,会生成第三张表:app01_boy_m
                    # 由于没有和app01_boy_m相对应的类,所有不能直接对第三张表操作
                    # 而且,第三张表只有三列(id, boy_id, girl_id)
    
    
                class Girl(models.Model):
                    name = models.CharField(max_length=32)
    
    
                1 正向,间接操作app01_boy_m , (通过boy对象来操作m, m是第三张表)
    
                    - 通过boy对象获取第三张表对象
                      boy_obj = models.Boy.objects.filter(id=1).first()
                      print(boy_obj.id, boy_obj.name, boy_obj.m)
    
                    - 插入数据,此时boy_id = 1,因此只需要添加gril_id即可
                         boy_obj.m.add(2)
                         boy_obj.m.add(2,4)
                         boy_obj.m.add(*[1,2,3,4])
    
                    - 删除数据
                        boy_obj.m.remove(2)
                        boy_obj.m.remove(2,4)
                        boy_obj.m.remove(*[1,2,3,4])
    
                    - 修改数据
                        boy_obj.m.set([1,]) # 将原来和boy_id=1有关系的行全部删除,然后重新添加一行 gril_id=1
    
                    - 查询数据 all
                        obj = models.Boy.objects.filter(name='方少伟').first()
                        girl_list = obj.m.all()
                        # girl_list 类型是[girl对象,girl对象,], 而且是和方少伟相关联的girl对象
    
                    - 查询数据 filter
                        obj.m.filter(name='小鱼')
    
                    - 清除数据clear
                        obj.m.clear()
    
                2 反向
                    obj = models.Girl.objects.filter(name='小鱼').first()
                    obj.boy_set.all()
                    obj.boy_set.add()
                    obj.boy_set.filter()
                    obj.boy_set.clear()
                    obj.boy_set.set()
                    obj.boy_set.remove()
    
            3 整合django自动创建 + 自己创建
                class Boy(models.Model):
                    name = models.CharField(max_length=32)
                    m = models.ManyToManyField('Girl',through='Love', through_fields=('b', 'g'))
    
    
                class Girl(models.Model):
                    name = models.CharField(max_length=32)
    
    
                class Love(models.Model):
                    b = models.ForeignKey('Boy')
                    g = models.ForeignKey('Girl')
                    # time = models.DateTimeField()
    
                    class Meta:
                        unique_together = [
                            ('b', 'g'),
                        ]
    
                同时利用django自建表的查询(all, filter) 和清空 (clear)的好处,又想利用自己创建类实现第三张表的好处(可以增加很多字段比如时间等)
                - 总而言之,(增,改,删)通过Love来实现, 查询通过django自带的来实现
    
                obj = models.Boy.filter(name='方少伟').first()
                obj.m.all()
                obj.m.filter(name='小鱼')
                obj.m.clear()
    
                ps: 不支持obj.m.add() 和 obj.m.remove(), 以及obj.m.set()
    View Code

    10 补充orm字段

    10 补充orm字段
        - 类型:
            1 字符串类:
                CharField()
            2 数字类:
                IntegerField()
                DecimalField()
            3 时间类:
                DateField()
                DateTimeField()
            4 枚举类:
                color_list = (
                    (1, '黑色'),
                    (2, '白色'),
                    (3, '蓝色')
                )
                color = models.IntegerField(choices=color_list)
    
                应用场景: 选项固定,(和foreignkey不冲突,foreignkey是选项可扩展)
    
            ps: django-admin需要注意的字段类型(先做正则的验证)
                - email
                - IP
                - URL
                - UUID
    
        - 参数
            - 给数据库用的参数(不考虑django-admin)
                1 是否为空
                    null=True
                2 默认值
                    default = 11
                3 单列索引
                    db_index=True
                4 单列唯一索引
                    unique=True
                5 主键
                    primeKey=True
                6 max_length
    
                7 联合索引
                    - 联合唯一索引
                         class Meta:
                            unique_together=(
                                ('a', 'b'),
                            )
                    - 联合索引
                        class Meta:
                            unique_together=(
                            ('a', 'b'),
                            )
    
            - 给django admin使用的参数
                1 blank=True  # admin页添加时,允许为空
                2 verbose_name
                3 error_message
                4 validators
    View Code

    11补充自关联(相亲)

    补充orm 自关联:(表A关联表A本身)
             相亲里面,UserInfo表男生和UserInfo表女生关联(表自关联)
            - ForeinKey参数补充to, to_field
               class User(models.Model):
                   username = models.CharField(max_length=32)
                   ut = models.ForeinKey(to='UserType', to_field='title')
    
               class UserType(models.Model):
                   title = models.CharField(max_length=64)
    
            - ForeignKey 自关联
                #数据库表设置
                    class UserInfo(models.Model):
                        nickname = models.CharField(max_length=32)
                        username = models.CharField(max_length=32)
                        password = models.CharField(max_length=64)
                        gender_choice = (
                            (1, ''),
                            (2, ''),
                        )
                        gender = models.IntegerField(choices=gender_choice)
    
                    class U2U(models.Model):
                        b = models.ForeignKey('UserInfo', related_name='b')
                        g = models.ForeignKey('UserInfo', related_name='g')
    
                #数据库查询
                    # 有了related_query_name时,从UserInfo反向查询方式
                    # related_query_name:
                    # obj对象男.b_set.all()
                    # obj对象女.a_set.all()
    
                    # related_name
                    # obj对象男.b.all()
                    # obj对象女.a.all()
    
    
                    # 获取UserInfo对象lzp
                    lzp = models.UserInfo.objects.filter(id=3, gender=1).first()
                    # 反向查询获取U2U对象( result是[ u2uobj, u2uobj])
                    result = lzp.girls.all()
                    for u in result:
                        #从一个u2u对象,正向连表查询UserInfo
                        print(u.g.username)
    
    
    
            - ManyToMany自关联
                a.数据库设置
                    class UserInfo(models.Model):
                        nickname = models.CharField(max_length=32)
                        username = models.CharField(max_length=32)
                        password = models.CharField(max_length=64)
                        gender_choice = (
                            (1, ''),
                            (2, ''),
                        )
                        gender = models.IntegerField(choices=gender_choice)
    
                        m = models.ManyToManyField('UserInfo')
                b.数据库查询
                    # ManyToManyField会自动生成第三张表app02_userinfo_m
                    # 里面有三个字段,id, from_userinfo_id, to_userinfo_id
                    # UserInfo对象.m.all()  表示select ** from xx where from_userinfo_id=
    
                    # obj.userinfo_set.all() 表示select * from xx where to_userinfo_id =
    
                    #自己做了规定,不是django:from_userinfo_id表示男生列,to表示女生列
    
                        # 已知男生id,查相关的女生
                        lzp = models.UserInfo.objects.filter(id=3).first()
                        result = lzp.m.all()
                        # print(result) # result类型为[userInfo对象, userInfo对象,]
                        for row in result:
                            print(row.username)
    
                        # 已知女生id,查相关男生名字
                        xzq = models.UserInfo.objects.filter(id=4).first()
                        result = xzq.userinfo_set.all()
                        for row in result:
                            print(row.username)
    View Code

    12补充相亲数据库设置

    d.实现
                #数据库
                class UserInfo(models.Model):
                    nickname = models.CharField(max_length=32)
                    username = models.CharField(max_length=32)
                    password = models.CharField(max_length=64)
                    gender_choice = (
                        (1, ''),
                        (2, ''),
                    )
                    gender = models.IntegerField(choices=gender_choice)
    
    
                class U2U(models.Model):
                    b = models.ForeignKey('UserInfo', related_name='girls') # 男生相关联女生
                    g = models.ForeignKey('UserInfo', related_name='boys')
                    # 还需要设置, related_name,或者related_query_name
                    # 否则从UserInfo的一个对象,反向查询的时候,不知道找b_id,hais g_id
                    # 有了related_query_name时,从UserInfo反向查询方式
                    # related_query_name:
                    # obj对象男.b_set.all()
                    # obj对象女.a_set.all()
    
                    # related_name
                    # obj对象男.b.all()
                    # obj对象女.a.all()
    
                    # 自己规定b_id表示男生id, g_id表示女生id, 但是数据库没有做约束
    
                # views
                def model_test(request):
                    # 获取UserInfo对象lzp
                    lzp = models.UserInfo.objects.filter(id=3, gender=1).first()
                    # 反向查询获取U2U对象( result是[ u2uobj, u2uobj])
                    result = lzp.girls.all()
                    for u in result:
                        #从一个u2u对象,正向连表查询UserInfo
                        print(u.g.username)
                    return  HttpResponse('PP')
    View Code

     13补充自关联ForeignKey

        # ForeignKey自关联(评论表)
            # ForeignKey自关联,ForeignKey是多对一(只有两张表,而ForeignKey自关联只有一张表,
            # 可以想象复制一份表,和原表进行关联
            class Comment(models.Model):
                news_id = models.IntegerField()             # 新闻id
                content = models.TextField()                # 评论内容
                user = models.CharField(max_length=32)      # 评论者
                reply = models.ForeignKey('Comment', null=True, blank=True, related_name='xxx')
    
                #评论表, reply_id
                """
                自增id, news_id,    content,     user         reply_id(回复那条评论)
                1       1           别bb         lzp             null
                2       1           就bb         wpq              1
                3       1           艹           lzp              2
                4       2           写得真好     lzp              null
                5       2           good         fsw              null
                6       2           同感         wpq              5
                """
    View Code

     14 批量插入数据bulk_create

    querysetlist=[]
    for i in resultlist:
    querysetlist.append(Account(name=i)) 
    Account.objects.bulk_create(querysetlist)
    
    # 假设Account只有个name一个字段是必填项,
    querysetlist = [
    Account(name="lzp"),
    Account(name="lzp")
    ]
    View Code

     15 补充django连接多个数据库

      http://www.cnblogs.com/dreamer-fish/p/5469141.html

  • 相关阅读:
    企业微信自建应用使用审批流程引擎
    unicode和utf8互转【转】
    禅道迅捷版,人人都可用的项目管理工具!
    《2021年IT行业项目管理调查报告》重磅发布!
    wxpython窗体之间传递参数
    go Print 和 反射
    go 接口学习笔记
    设计模式学习笔记
    go 变量逃逸分析
    Go ASM 学习笔记之 ppt 版
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7755216.html
Copyright © 2020-2023  润新知