• Django (一)


    一. 基本配置

    1. 数据库

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'dbname',
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        }
    }
    
    # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
      
    # 如下设置放置的与project同名的配置的 __init__.py文件中
      
    import pymysql
    pymysql.install_as_MySQLdb()
    

    2. 模版

    TEMPLATE_DIRS = (
            os.path.join(BASE_DIR,'templates'),
        )
    

    3. 静态文件

    STATICFILES_DIRS = (
            os.path.join(BASE_DIR,'static'),
    )
    

    4. 新增APP

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
        'app02',
    ]

    二. 路由配置系统(URLconf)

    URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码
    对于那个URL调用那段代码
        urlpatterns = [
             url(正则表达式, views视图函数,参数,别名),
    ]
    
    参数说明:
    
        一个正则表达式字符串
        一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
        可选的要传递给视图函数的默认参数(字典形式)
        一个可选的name参数
    

    1. 单一路由对应

    url(r'^index$', views.index)
    

    2. 基于正则的路由

    #  $
    url(r'^index/(d{4})$',views.index)
    
    #无命名分组
    url(r'^index/(d{4})/(d{2})',views.index)
    
    #有命名分组
    url(r'^index/(?P<year>d{4})/(?P<month>d{2})',views.index)
    
    ############################无命名
    
    #-----------------() 相当于传参数 
    
    url(r'^index/(d{4})',views.index)
        
        def index(request,arg):
            return HttpResponse(arg)    
    
    #url访问http://127.0.0.1:8000/index/1113
    1113
    
    #-----------------() 接受两个参数
    
    url(r'^index/(d{4})/(d{2})',views.index)
    
        def index(request,arg,arg1):
            return HttpResponse("year: %s month: %s"%(arg,arg1))
    
    #url访问http://127.0.0.1:8000/index/2017/06
        year: 2017 month: 06
    
    
    
    ############################有命名
    url(r'^index/(?P<year>d{4})/(?P<month>d{2})',views.index)
    
        def index(request,year,month):
            return HttpResponse("year: %s month: %s"%(year,month))
    
    #url访问http://127.0.0.1:8000/index/2017/06
        year: 2017 month: 06
    有无命名分组 演示

    3. 为路由映射设置名称 

    #应用一:
    url(r'^index',views.index,name="arg")
    
    {{ url "arg" }} 	匹配index
    {{ url "arg" i}}
    
    #应用二:
    reverse反向获取url
    
    ##############根据url反生成名字
    from django.shortcuts import reverse
    
    url(r'^index',views.index,name="arg")
    
    def index(request):
        v = reverse("arg")
        print(v)
        return HttpResponse()
    
     #用户访问http://127.0.0.1:8000/index
     /index
    
    
    ##############根据url改变url
    
    url(r'^index/(d+)/',views.index,name="n1")
    
    def index(request,xx):
    
        v = reverse('n1',args=(1,))
        print(v)
        return HttpResponse("...")
    
     #访问http://127.0.0.1:8000/index/222/
     /index/1/
    reverse示例 演示

    4. 路由分发

    url(r'^app01/',include("app01.urls"))
    url(r'^app02/',include("app02.urls"))
    
    #没有匹配成功,返回默认页面
    url(r'^',include("views.default"))
    

    三 .Model

    a. 创建表 

    from django.db import models
    
    
    class User_type(models.Model):
        uid = models.BigAutoField(primary_key=True)
        title = models.CharField(max_length=32)
    
    class User_info(models.Model):
        name = models.CharField(max_length=32)
        age = models.CharField(max_length=32)
        ut = models.ForeignKey("User_type")
    
    
    python3 manage.py makemigrations
    
    python3 manage.py migrate
    
    
    ---------------------其它---------------------
    
    class part(models.Model):
        cid = models.BigAutoField(primary_key=True)
        title = models.CharField(max_length=32,null=False)
    
    
    class student(models.Model):
        sid = models.BigAutoField(primary_key=True)
        name = models.CharField(max_length=32,null=False)
        pub_data=models.DateField()
        age = models.IntegerField(default=18)
        # 新增加的列 如果原先表里有值,写default
        ug = models.ForeignKey("part",null=True) #如果新增加外键,加null=True
    View Code

    b. ORM操作

    #
    # models.User_type.objects.create(title="黑金用户")
        
    # obj = models.User_type(title="小白用户")
    # obj.save()
    
    
    #
    #models.User_type.objects.filter(title="小白用户").delete()  # 删除指定条件的数据
    
    #
    #models.User_type.objects.filter(title="黑金用户").update(title="黑卡用户")    # 修改指定条件的数据
    
    #
    # models.User_type.objects.get(title="大白用户")      # 获取单条数据,不存在则报错(不建议)
    # models.User_type.objects.all()                     # 获取全部
    # models.User_type.objects.filter(title="小白用户")   # 获取指定条件的数据
    # models.User_type.objects.exclude(title="黄金用户")     # 排除指定条件的数据
    基本增删改查
    # 获取个数
    
    models.User_info.objects.filter(age=18).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__gt=1,id__lt=10)     # 获取id大于1 且 小于10的值
    
    
    
    #in
    
    models.User_info.objects.filter(age__in=[19])        #  in 
    models.User_info.objects.exclude(age__in=[19])        #  not in
    
    
    # isnull
    
    models.User_info.objects.filter(age__isnull=True)    # age列为不为空
    models.User_info.objects.filter(age__isnull=False)    # age列是不是 不为空
    
    
    # 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, 5])   # 范围bettwen and
    
    
    #开始 结束
    
    # startswith,istartswith, endswith, iendswith
    
    
    
    #order_by 
    
    #models.User_info.objects.all().order_by("id")                # asc
    #models.User_info.objects.all().order_by("-id")                # desc
    
    # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
    # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc
    
    
    
    #group by     #后面出现filter代表having
    
    from django.db.models import Count
    #models.User_info.objects.values("name","age").annotate()                    #没有起作用
    #SELECT "app01_user_info"."name", "app01_user_info"."age" FROM "app01_user_info"
    
    #models.User_info.objects.values("age").annotate(xxx=Count("age"))
    #SELECT "app01_user_info"."age", COUNT("app01_user_info"."age") AS "xxx" FROM "app01_user_info" GROUP BY "app01_user_info"."age"
    
    #models.User_info.objects.values("age").annotate(xxx=Count("age")).filter(xxx__gt=2)        #年龄相同次数大于2的查出来
    #SELECT "app01_user_info"."age", COUNT("app01_user_info"."age") AS "xxx" FROM "app01_user_info" GROUP BY "app01_user_info"."age" HAVING COUNT("app01_user_info"."age") > 2
    
    
    #注意两次filter  第一次代表where  第二次代表having
    
    #models.User_info.objects.filter(id__gt=2).values("age").annotate(xxx=Count("age")).filter(xxx__gt=2)        
    #SELECT "app01_user_info"."age", COUNT("app01_user_info"."age") AS "xxx" FROM "app01_user_info" WHERE "app01_user_info"."id" > 2 GROUP BY "app01_user_info"."age" HAVING COUNT("app01_user_info"."age") > 2
    常用方法
    # F
    
    # from django.db.models import F
    # models.User_info.objects.all().update(age=F("age")+5)        # age列加5
    
    
    # Q
    
    # 方式一:
    # Q(nid__gt=10)
    # Q(nid=8) | Q(nid__gt=10)
    # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    
    
    #-------------------------------以下三种查找方式相同效果
    
    # obj = models.User_info.objects.filter(id=307,name="egon")
    
    # condition ={
    #     'id':307,
    #     'name':'egon',
    # }
    # obj = models.User_info.objects.filter(**condition)
    
    #obj = models.User_info.objects.filter(Q(id=307) & Q(name="egon"))
    ---------------------------------
    
    
    # 方式二:
    
    
    # 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))
    
    # q3 = Q()
    # q3.connector = 'AND'
    # q3.children.append(('id', 1))
    # q3.children.append(('id', 2))
    # q1.add(q3, 'OR')
    
    # con = Q()
    # con.add(q1, 'AND')
    # con.add(q2, 'AND')
    
    #(id=1 or id=10 or id=9 or (id=1 and id=2)) and (c1=1 or c1=10 or c1=9)  #等于上面
    
    # models.Tb1.objects.filter(con)
    
    
    # Q演示
    condition_dict = {
            'k1':[1,2,3,4],
            'k2':[1,],
            'k3':[11,]
    }
    
    con = Q()
    for k,v in condition_dict.items():
        q = Q()
        q.connector = 'OR'
        for i in v:
            q.children.append(('id',1))
        con.add(q,'AND')
    
    models.User_info.objects.filter(con)
    F Q 演示
    # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
    
    # a. 映射
        select
        select_params=None
        select 此处 from# b. 条件
        where=None
        params=None
        select * from 表 where 此处
    
    # c. 表
        table
        select * from 表,此处
    
    # d. 排序
        prder_by=None
        select * from 表 order by 此处
    
    
    result = models.User_info.objects.extra(
            select={"newid":"selet count(1) from app01_usertype where id>%s"},
            select_params=[1,],
            where = ["age>%s"],
            params=[18,],
            order_by=["-age"],
            tables=["app01_usertype"]
        )
    
     SELECT 
         (selet count(1) from app01_usertype where id>1) AS "newid", 
         "app01_user_info"."id", 
         "app01_user_info"."name", 
         "app01_user_info"."age", 
         "app01_user_info"."ut_id" 
    
     FROM "app01_user_info" , "app01_usertype" 
     WHERE (age>18) 
     ORDER BY "app01_user_info"."age" DESC
    
    
    
    #-------------------------------------
    
    v = models.User_info.objects.all().extra(
        select={'n':"select count(1) from app01_user_type  where uid >2"}
        )
    
    
    SELECT 
        (select count(1) from app01_user_type where uid >2) AS "n", 
        "app01_user_info"."id",
        "app01_user_info"."name",
        "app01_user_info"."age", 
        "app01_user_info"."ut_id" 
    FROM "app01_user_info"
    
    #-------------------------------------
    
    v = models.User_info.objects.all().extra(
        select={'n':"select count(1) from app01_user_type where uid=%s or uid=%s"},
        select_params=[1,3]
        )
    
    SELECT 
        (select count(1) from app01_user_type where uid=1 or uid=3) AS "n", 
        "app01_user_info"."id", 
        "app01_user_info"."name",
        "app01_user_info"."age",
        "app01_user_info"."ut_id"
    FROM "app01_user_info"
    
    #------------- select_params ------------------------
    
    v = models.User_info.objects.all().extra(
        select={
            'm':"select count(1) from app01_user_type where uid=%s or uid=%s",
            'n':"select count(1) from app01_user_type where uid=%s or uid=%s",
        },select_params=[1,2,3,4])
    
    
    SELECT 
        (select count(1) from app01_user_type where uid=1 or uid=2) AS "m",
        (select count(1) from app01_user_type where uid=3 or uid=4) AS "n",
        "app01_user_info"."id", 
        "app01_user_info"."name", 
        "app01_user_info"."age", 
        "app01_user_info"."ut_id" 
    FROM "app01_user_info"
    
    
    
    #--------------  where  -----------------------
    
    v = models.User_info.objects.extra(
        where=["id=%s or id=%s","name=%s"],
        params=[1,307,"egon"]
    )
    
    
    SELECT 
        "app01_user_info"."id",
        "app01_user_info"."name",
        "app01_user_info"."age",
        "app01_user_info"."ut_id"
    FROM "app01_user_info" WHERE (id=1 or id=307) AND (name=egon)
    
    
    #--------------  table  -----------------------
    
    #笛卡尔积
    
    #示例一:
    result = models.User_info.objects.extra(
        tables=["app01_user_type"],
    )
    
    
    SELECT 
        "app01_user_info"."id", 
        "app01_user_info"."name", 
        "app01_user_info"."age", 
        "app01_user_info"."ut_id" 
    
    FROM "app01_user_info" , "app01_user_type"
    
    
    #示例二:
    
    
    result = models.User_info.objects.extra(
        tables=["app01_user_type"],
        where=["app01_usertype.id = app01_userinfo.ut_id"]
    )
    
    
    SELECT 
        "app01_user_info"."id", 
        "app01_user_info"."name", 
        "app01_user_info"."age", 
        "app01_user_info"."ut_id" 
    
    FROM "app01_user_info" , "app01_user_type" 
    WHERE (app01_usertype.id = app01_userinfo.ut_id)
    extra
    # 获取到querySet里面的结果如果是对象 循环对象. 实现跨表
                        结果如果是{}或(),取值时__实现跨表
    
    
    models.UserInfo.object.all()                            #获取到querySet 里面是对象类型    [obj,obj,obj]
                                                            #对象可以分装很多值,可以跨表
    
    models.UserInfo.object.all().values("id","name")        #获取到querySet 里面是字典类型    [{},{},{},{}]
                                                            #obj["id"],obj["name"]
    
    models.UserInfo.object.all().values_list("id","name")   #获取到querySet 里面是元组类型 [(),(),()]
                                                            #obj[0],obj[1]
    
    models.UserInfo.object.all().values("id","name","ut__title")
    对象 字典 列表

    c. 多对多操作

    方式一:通过外键创建第三张表

    m = models.ManyToManyField("Girl")   	#如果下面写成这种方式会创建4张表
    m = models.ManyToManyField("Girl",through="Love",through_fields=("b","g",))		#会生成3张表
    
    ManyToManyField
    
    
    class Boy(models.Model):
        name = models.CharField(max_length=32)
       
     
    class Girl(models.Model):
        nick = models.CharField(max_length=32)
     
    class Love(models.Model):
        b = models.ForeignKey("Boy")
        g = models.ForeignKey("Girl")
     
        class Meta:
            unique_together = [
                ("b","g"),
            ]
    #表里插入数据
    
    objs = [
            models.Boy(name='方少伟'),
            models.Boy(name='游勤斌'),
            models.Boy(name='于浩'),
            models.Boy(name='陈涛'),
    ]
    models.Boy.objects.bulk_create(objs,4)
    
    result = [
        models.Girl(nick='于浩姐姐'),
        models.Girl(nick='景甜'),
        models.Girl(nick='刘亦非'),
        models.Girl(nick='苍老师'),
    ]
    models.Girl.objects.bulk_create(result, 4)
    
    models.Love.objects.create(b_id=1,g_id=1)
    models.Love.objects.create(b_id=1,g_id=2)
    models.Love.objects.create(b_id=1,g_id=3)
    models.Love.objects.create(b_id=2,g_id=4)
    
    
    ###################   查找和我有关系的女孩  四种方式 ################
    
    
    obj = models.Boy.objects.filter(name="方少伟").first()
    love_list = obj.love_set.all()
    for row in love_list:
       print(row.g.nick)
    
    love_list = models.Love.objects.filter(b__name="方少伟")
    for row in love_list:
        print(row.g.nick)
    
    
    #下面两个效果好
    
    love_list = models.Love.objects.filter(b__name="方少伟").values("g__nick")
    for item in love_list:
        print(item["g__nick"])   
        
    
    
    love_list = models.Love.objects.filter(b__name="方少伟").select_related("g")
    for obj in love_list:
        print(obj.g.nick)
    SQL演示

    方式二:通过 ManyToManyField 创建第三张表

    class Boy(models.Model):
        name = models.CharField(max_length=32)
        m = models.ManyToManyField("Girl")
    
    class Girl(models.Model):
        nick = models.CharField(max_length=32)
    
    obj = models.Boy.objects.filter(name="方少伟").first()
        # print(obj.id,obj.name)
    
        # obj.m.add(2)
        # obj.m.add(1,3)
        # obj.m.add(*[4,])
    
        # obj.m.remove(2)
        # obj.m.remove(1,3)
        # obj.m.remove(*[4,])
    
        # obj.m.set([1,4,])
    
    
        # girl_list = obj.m.all()
        # girl_list = obj.m.filter(nick="苍老师")
    
    
        # obj.m.clear()
    
    obj = models.Girl.objects.filter(nick="苍老师").first()
    v = obj.boy_set.all()        
    SQL 演示

    方式三:通过 外键 和 ManyToManyField 创建

    class Boy(models.Model):
        name = models.CharField(max_length=32)
        m = models.ManyToManyField("Girl",through="Love",through_fields=("b","g",))
    
    class Girl(models.Model):
        nick = models.CharField(max_length=32)
    
    class Love(models.Model):
        b = models.ForeignKey("Boy")
        g = models.ForeignKey("Girl")
    
        class Meta:
            unique_together = [
                ("b","g"),
            ]
    
    obj = models.Boy.objects.filter(name="方少伟").first()
    
    #只可以查或清空
    obj.m.clear()
    
    obj.m.all()
    SQL 操作

    d. 一对多 

    # 对象连表正向操作:
     
    objSet = models.User_info.objects.all()
    for obj in objSet:
        print(obj.name, obj.age, obj.ut.title)
     
     
    # 对象连表反向操作:
     
    objSet = models.User_type.objects.all()
    for row in objSet:
        print(row.title, row.user_info_set.all())
        for i in row.user_info_set.all():
            print(i.name)
     
    # value连表正向操作:
     
    obj = models.User_info.objects.values("ut__title","name")
    for row in obj:
        print(row)
     
    # value连表反向操作:
     
    obj = models.User_type.objects.values("user_info__name","title")
    for row in obj:
        print(row)
    View Code

    1.连表操作演示

    urlpatterns = [
     
        url(r'^test/', views.test),
    
    ]
    urls.py
    class User_type(models.Model):
        uid = models.BigAutoField(primary_key=True)
        title = models.CharField(max_length=32)
    
    class User_info(models.Model):
        name = models.CharField(max_length=32)
        age = models.CharField(max_length=32)
        ut = models.ForeignKey("User_type")
    models.py
    def test(request):
        models.User_type.objects.create(title="普通用户")
        models.User_type.objects.create(title="白金用户")
        models.User_type.objects.create(title="黄金用户")
    
    
        models.User_info.objects.create(name="小鸡",age=18,ut_id=1)
        models.User_info.objects.create(name="小狗",age=18,ut_id=2)
        models.User_info.objects.create(name="小猫",age=18,ut_id=2)
        models.User_info.objects.create(name="小雨",age=18,ut_id=3)
        models.User_info.objects.create(name="大雨",age=18,ut_id=1)
    
        for i  in range(300):
            name = "root" + str(i)
            models.User_info.objects.create(name=name, age=18, ut_id=1)
    
        #正向操作
        obj = models.User_info.objects.all().first()
        print(obj.name,obj.age,obj.ut.title)
    
        #反向操作   obj.表名小写_set.all()
        obj = models.User_type.objects.all().first()
        for row in obj.user_info_set.all():
            print(row.name,row.age)
    
        result = models.User_type.objects.all()
        for item in result:
            print(item.title,item.user_info_set.all())
            print(item.user_info_set.filter(name="小雨"))
    
    
        #字典格式
        result = models.User_info.objects.all().values("id","name")
        for row in result:
            print(row)
    
        #字典格式查的时候跨表
        result = models.User_info.objects.all().values("id","name","ut__title")
        for row in result:
            print(row["id"],row["name"],row["ut__title"])
    
    
    
    
    
        # 元组格式
        # result = models.User_info.objects.all().values_list("id","name")
        # for row in result:
        #     print(row)
    
        return HttpResponse(".....")
    views.py

    e. 关联

    1. 方式一:

    class UserInfo(models.Model):
        nickname = models.CharField(max_length=32)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        gender_choices = (
            (1,''),
            (2,''),
        )
        gender = models.IntegerField(choices=gender_choices)
    
    
    # obj对象男.a.all()     反向查找
    # obj对象女.b.all()     反向查找
    class U2U(models.Model):
        b = models.ForeignKey("UserInfo",related_name="a")
        g = models.ForeignKey("UserInfo",related_name="b")
    
    
    # obj对象男.a_set.all()     反向查找
    # obj对象女.b_set.all()     反向查找
    # class U2U(models.Model):
    #     b = models.ForeignKey("UserInfo",related_query_name="a")
    #     g = models.ForeignKey("UserInfo",related_query_name="b")
    ForeignKey 关联两个表
        # models.U2U.objects.create(b_id=2,g_id=5)
        # models.U2U.objects.create(b_id=2,g_id=4)
        # models.U2U.objects.create(b_id=2,g_id=6)
    
        #这种方式也是插入的ID
        # boy = models.UserInfo.objects.filter(gender=1,id=2).first()
        # girl = models.UserInfo.objects.filter(gender=2,id=5).first()
        # models.U2U.objects.create(b_id=boy,g_id=girl)
    插入性别两种方式
        two = models.UserInfo.objects.filter(id=2).first()
        result = two.girls.all()
        for u in result:
            print(u.g.nickname)
    查找数据

    2. 方式二:

    class UserInfo(models.Model):
        nickname = models.CharField(max_length=32)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        gender_choices = (
            (1,''),
            (2,''),
        )
        gender = models.IntegerField(choices=gender_choices)
        m = models.ManyToManyField("UserInfo")
    
    
    
    #--------------------------------------------
    
    
        #   男生查女生
        #   xz.m 用的第二张表的第一列
        xz = models.UserInfo.objects.filter(id=1).first()
        u = xz.m.all()
        for row in u:
            print(row.nickname)
    
    
        #   女生查男生
        #   xz.userinfo_set 用的第二张表的第二列
        xz =  models.UserInfo.objects.filter(id=4).first()
        v = xz.userinfo_set.all()
        for row in v:
            print(row.nickname)
    View Code

    f: 例子

    from django.db import models
    
    
    class UserInfo(models.Model):
        """
        用户表
        """
        nid = models.BigAutoField(primary_key=True)
        username = models.CharField(verbose_name='用户名', max_length=32, unique=True)
        password = models.CharField(verbose_name='密码', max_length=64)
        nickname = models.CharField(verbose_name='昵称', max_length=32)
        email = models.EmailField(verbose_name='邮箱', unique=True)
        avatar = models.ImageField(verbose_name='头像')
    
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    
        fans = models.ManyToManyField(verbose_name='粉丝们',
                                      to='UserInfo',
                                      through='UserFans',
                                      related_name='f',
                                      through_fields=('user', 'follower'))
    
    
    class Blog(models.Model):
        """
        博客信息
        """
        nid = models.BigAutoField(primary_key=True)
        title = models.CharField(verbose_name='个人博客标题', max_length=64)
        site = models.CharField(verbose_name='个人博客前缀', max_length=32, unique=True)
        theme = models.CharField(verbose_name='博客主题', max_length=32)
        user = models.OneToOneField(to='UserInfo', to_field='nid')
    
    
    class UserFans(models.Model):
        """
        互粉关系表
        """
        user = models.ForeignKey(verbose_name='博主', to='UserInfo', to_field='nid', related_name='users')
        follower = models.ForeignKey(verbose_name='粉丝', to='UserInfo', to_field='nid', related_name='followers')
    
        class Meta:
            unique_together = [
                ('user', 'follower'),
            ]
    
    
    class Category(models.Model):
        """
        博主个人文章分类表
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='分类标题', max_length=32)
    
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
    
    
    class ArticleDetail(models.Model):
        """
        文章详细表
        """
        content = models.TextField(verbose_name='文章内容', )
    
        article = models.OneToOneField(verbose_name='所属文章', to='Article', to_field='nid')
    
    
    class UpDown(models.Model):
        """
        文章顶或踩
        """
        article = models.ForeignKey(verbose_name='文章', to='Article', to_field='nid')
        user = models.ForeignKey(verbose_name='赞或踩用户', to='UserInfo', to_field='nid')
        up = models.BooleanField(verbose_name='是否赞')
    
        class Meta:
            unique_together = [
                ('article', 'user'),
            ]
    
    
    class Comment(models.Model):
        """
        评论表
        """
        nid = models.BigAutoField(primary_key=True)
        content = models.CharField(verbose_name='评论内容', max_length=255)
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    
        reply = models.ForeignKey(verbose_name='回复评论', to='self', related_name='back', null=True)
        article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid')
        user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid')
    
    
    class Tag(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='标签名称', max_length=32)
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
    
    
    class Article(models.Model):
        nid = models.BigAutoField(primary_key=True)
        title = models.CharField(verbose_name='文章标题', max_length=128)
        summary = models.CharField(verbose_name='文章简介', max_length=255)
        read_count = models.IntegerField(default=0)
        comment_count = models.IntegerField(default=0)
        up_count = models.IntegerField(default=0)
        down_count = models.IntegerField(default=0)
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
        category = models.ForeignKey(verbose_name='文章类型', to='Category', to_field='nid', null=True)
    
        type_choices = [
            (1, "Python"),
            (2, "Linux"),
            (3, "OpenStack"),
            (4, "GoLang"),
        ]
    
        article_type_id = models.IntegerField(choices=type_choices, default=None)
    
        tags = models.ManyToManyField(
            to="Tag",
            through='Article2Tag',
            through_fields=('article', 'tag'),
        )
    
    
    class Article2Tag(models.Model):
        article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
        tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid')
    
        class Meta:
            unique_together = [
                ('article', 'tag'),
            ]
    sql.py
        #一对多  获取当前博客所有文章
    
        #正向
        models.Article.objects.filter(blog=blog)
        models.Article.objects.filter(blog_id=blog.nid)
        #反向
        blog = models.Blog.objects.filter(site=site).first()
        blog.article_set.all()
    
    
        # 一对一 将blog和userinfo连接在一起,再根据site进行筛选
    
        # 正向 通过博客,获取用户信息:
        blog = models.Blog.objects.filter(site=site).first()
        print(blog.user.nickname)
    
        models.Blog.objects.filter(site=site).values('site','user__nickname')
        
        #反向
        v = models.UserInfo.objects.filter(blog__site=site).values('blog__site','nickname')
        
        obj = models.Blog.objects.filter(site=site).first()
        print(obj.user.nickname)
    
        #反向 给用户名,获取博客后缀
        obj = models.UserInfo.objects.filter(username='sw').first()
        print(obj.blog.site)
    

      

    --------------------------------------------------------------
    all()                        [obj,obj,obj]
    filter()                     [obj,obj,obj]
    first()                      obj
    values("uid","title")        [{},{},{}]
    value_list()                 [(),(),()]
    
        models.user_info.objects.values("uid","title")         
                [ {"uid":1,"title":"CEO"},{"uid":2,"title":"CTO"},{"uid":3,"title":"CFO"}  
        models.User_type.objects.values_list("uid","title")
            [(1, 'CEO'), (2, 'CFO')]                           
    
    
    ---------------------------------------------------------------
    
    一对多:
    
        class User_type(models.Model):
        uid = models.BigAutoField(primary_key=True)
        title = models.CharField(max_length=32)
    
    
        class User_info(models.Model):
            name = models.CharField(max_length=32)
            age = models.CharField(max_length=32)
            ut = models.ForeignKey("User_type")
    
    
        User_type               User_info
    
        id   title              id   name    age     ut
        1      CTO              1     alex    18      1
                                2     egon    17      1
    
    
        1. 正向操作    
            
            #对象查找   跨表 对象.关联字段.字段
    
                user_obj = models.User_info.objects.filter(id=1).first()
    
                print("user_obj.id---",user_obj.id)
                print("user_obj.name---", user_obj.name)
                print("user_obj.age---", user_obj.age)
                print("user_obj.ut---", user_obj.ut)
                print("user_obj.ut_id---", user_obj.ut_id)
                print("user_obj.ut.uid---", user_obj.ut.uid)
                print("user_obj.ut.title---", user_obj.ut.title)
    
            #字段查找   跨表  关联字段__字段
    
                models.User_info.objects.values("id","name","ut_id","ut__uid","ut__title")
    
        2. 反向操作
    
            #对象查找       跨表 对象.小写表名_set().all()  循环对象.字段
    
                type_obj = models.User_type.objects.filter(uid=1).first()
    
                print("type_obj.id---",type_obj.uid)
                print("type_obj.title---", type_obj.title)
                print("obj", type_obj.user_info_set.all())
                
                obj = type_obj.user_info_set.all()
                for i in obj:
                    print(i.id)
                    print(i.name)
                    print(i.ut_id)
    
    
            #字段查找  跨表   反向小写表名__字段     
    
                models.User_type.objects.values("uid","title","user_info__name","user_info__age")
    一对多跨表操作

     http://www.cnblogs.com/wupeiqi/articles/6216618.html

      

      

      

      

    吴沛齐  

      

     

  • 相关阅读:
    Linux重定向命令
    ls命令
    Linux常用命令_(进程管理)
    Linux常用命令_(文件操作)
    Linux常用命令_(文件查看)
    Linux常用命令_(文件搜索)
    Oracle表空间管理
    如何测试数据库表空间不足场景
    find命令
    各种比例尺标准分幅图经差、纬差表
  • 原文地址:https://www.cnblogs.com/golangav/p/7064695.html
Copyright © 2020-2023  润新知