ORM(1)转载

博客核心内容:


1、Foreign_key可以理解为另外一张表的一行对象
2、通过双下划线可以跨到另外一张表
3、三种方法返回的都是query对象的集合(对象、字典、元组)
4、dp = models.ForeignKey(to="Depart", to_field='id')中的dp实际上是一个对象,在数据库中存在的真正字段是dp_id

表结构展示:
这里写图片描述

程序1:

from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
    if request.method == "GET":
        pass
    elif request.method == "POST":
        pass
    return  HttpResponse("OK")


from django.views import View

class User(View):
    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj =  super(User,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj

    def get(self,request):
        print('get....')
        return HttpResponse("....")

    def post(self,request):
        print('post..')
        return HttpResponse("....")


from app01 import  models
def test(request):
    # models.Depart.objects.create(title='IT')
    # models.Depart.objects.create(title='咨询')
    # models.Depart.objects.create(title='公关')
    # models.UserInfo.objects.create(username='alex',password='123',dp_id=1)
    # models.UserInfo.objects.create(username='eric',password='123',dp_id=1)
    # models.UserInfo.objects.create(username='何磊',password='123',dp_id=1)
    # models.UserInfo.objects.create(username='刘浩',password='123',dp_id=2)

    #Foreign_key可以理解为另外一张表的一行对象
    #正向跨表:外键  反向跨表:表名或者表名__
    #正向跨表
    #1、对象
    # q = models.UserInfo.objects.all()
    # for row in q:
    #     print(row.username, row.password, row.dp_id, row.dp, row.dp.id, row.dp.title)
    """
    alex 123 1 Depart object 1 IT
    eric 123 1 Depart object 1 IT
    何磊 123 1 Depart object 1 IT
    刘浩 123 2 Depart object 2 咨询
    """

    #2、字典
    # q = models.UserInfo.objects.values('username', 'password', 'dp_id','dp__title')
    # for row in q:
    #     print(row)
    """
    {'password': '123', 'dp_id': 1, 'dp__title': 'IT', 'username': 'alex'}
    {'password': '123', 'dp_id': 1, 'dp__title': 'IT', 'username': 'eric'}
    {'password': '123', 'dp_id': 1, 'dp__title': 'IT', 'username': '何磊'}
    {'password': '123', 'dp_id': 2, 'dp__title': '咨询', 'username': '刘浩'}
    """

    #3、元组
    # q = models.UserInfo.objects.values_list('username', 'password', 'dp_id', 'dp__title')
    # for row in q:
    #     print(row)
    #     print(row[0],row[1],row[2],row[3])
    """
    ('alex', '123', 1, 'IT')
    alex 123 1 IT
    ('eric', '123', 1, 'IT')
    eric 123 1 IT
    ('何磊', '123', 1, 'IT')
    何磊 123 1 IT
    ('刘浩', '123', 2, '咨询')
    刘浩 123 2 咨询
    """

    #反向跨表
    #1、对象:个数就是另外一张表的行数
    # v = models.Depart.objects.all()
    # for row in v:
    #     # 可以获取到到当前部门下面的所有人:表名小写
    #     print(row,row.id,row.title,row.userinfo_set.all())

    """
    Depart object 1 IT <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
    Depart object 2 咨询 <QuerySet [<UserInfo: UserInfo object>]>
    Depart object 3 公关 <QuerySet []>
    """

    #2、字典:反向操作的时候可能出现空值
    v1 = models.Depart.objects.values('id','title')
    for row in v1:
        print(row)
    """
    {'title': 'IT', 'id': 1}
    {'title': '咨询', 'id': 2}
    {'title': '公关', 'id': 3}
    """
    v2 = models.Depart.objects.values('id', 'title','userinfo','userinfo__username','userinfo__password')
    for row in v2:
        print(row)
    """
    {'title': 'IT', 'id': 1, 'userinfo__username': 'alex', 'userinfo': 1, 'userinfo__password': '123'}
    {'title': 'IT', 'id': 1, 'userinfo__username': 'eric', 'userinfo': 2, 'userinfo__password': '123'}
    {'title': 'IT', 'id': 1, 'userinfo__username': '何磊', 'userinfo': 3, 'userinfo__password': '123'}
    {'title': '咨询', 'id': 2, 'userinfo__username': '刘浩', 'userinfo': 4, 'userinfo__password': '123'}
    {'title': '公关', 'id': 3, 'userinfo__username': None, 'userinfo': None, 'userinfo__password': None}
    """

    #3、元组
    v3 = models.Depart.objects.values_list('id', 'title','userinfo','userinfo__username','userinfo__password')
    for row in v3:
        print(row)
    """
    (1, 'IT', 1, 'alex', '123')
    (1, 'IT', 2, 'eric', '123')
    (1, 'IT', 3, '何磊', '123')
    (2, '咨询', 4, '刘浩', '123')
    (3, '公关', None, None, None)
    """

    #多对多
    #1、自己写第三张表:第三张表的列数没有限制(注意:只有自己创建的第三张表才可以通过create方式进行添加操作)  
    # models.U2G.objects.create(ui_id=1, ug_id=2)
    # models.U2G.objects.create(ui_id=2, ug_id=2)
    # models.U2G.objects.create(ui_id=3, ug_id=1)

    # q = models.U2G.objects.all()
    # for row in q:
    #     # 通过外键可以获取一行对象
    #     print(row.ug.caption,row.ui.username)
    """
    B组 alex
    B组 eric
    A组 何磊
    """
    # 2、Django根据ManyToManyField字段自动创建的第三张表,列数有限制
    obj = models.UserGroup.objects.filter(id=1).first()  # B组
    #通过*在一个组里面添加两个人,也可以直接用逗号,(注意:ORM自己创建的第三张表是不能够通过create方式添加记录的,因为在orm当中没有这个类,还有另外一种方式添加:浩哥:见图1)下面是ORM自己创建的第三张表添加数据的方式.
    # obj.m.add(1)
    #obj.m.add(*[1,2])
    #obj.m.add(1,2,3,4)
    #obj.m.remove(1)
    #obj.m.remove(2,3)
    #obj.m.remove(*[4])
    #将2组的人记录全部删除
    #obj.m.clear()
    #obj.m.set([3,])
    #obj.m.set([3,2,1 ])
    """
    操作:add  remove clear set[改](设置完之后只有它自己,用来进行更新操作)
    非要更新:就先找到先删除,然后增加一条
    查看这个组下面的所有的人,直接拿到另外一张表
    """
    q1 = obj.m.all()
    print(q1)
    """
    <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
    """
    #通过m过滤的是用户表,而不是组表
    #建立在上次查询基础上,做二次查询
    q2_2 = obj.m.filter(id__gt=2)
    print(q2_2)
    """
    <QuerySet [<UserInfo: UserInfo object>]>
    """
    return HttpResponse("OK")

程序2:

from django.db import models

# Create your models here.
class Depart(models.Model):[出版社]
    title = models.CharField(max_length=16)



class UserInfo(models.Model):[书表]
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    #depart = models.ForeignKey("Depart")
    #depart = models.ForeignKey(to="Depart",to_field='id')
    #depart = models.IntegerField()
    dp = models.ForeignKey(to="Depart", to_field='id')  #dp_id
    #多对多并不会影响第三张表,在哪里创建都可以
    #m = models.ManyToManyField('UserGroup')


class UserGroup(models.Model):[作者表]
    caption = models.CharField(max_length=32)
    #多对多并不会影响第三张表,在哪里创建都可以
    #拿不到第三张表的类,怎么写入数据呢?
    m = models.ManyToManyField('UserInfo')

书表与作者是多对多的关系,书表里面没有作者,作者表里面没有书
# class U2G(models.Model):[图书与作者关系表]
#     ui = models.ForeignKey(to="UserInfo",to_field='id')
#     ug = models.ForeignKey(to="UserGroup",to_field='id')

#利用Django帮我们创建第三张表


#3、创建多对多的关系
# U2G.objects.create(ui_id = 1,ug_id=2)
# U2G.objects.create(ui_id = 2,ug_id=2)
# U2G.objects.create(ui_id = 3,ug_id=1)
#
# q = U2G.objects.all()
# for row in q:
#     #通过外键可以获取一行对象
#     row.ui.username
#     row.ug.caption











#方法1:获取用户所有的信息,包括部门名称:query对象集合
# q = UserInfo.objects.all()
# #query[obj(username,password,obj(dp[id,title]),dp_id)]
# for row in q:
#     print(row.username,row.password,row.dp_id,row.dp,row.dp.id,row.dp.title)


#方法2:获取用户所有的信息,包括部门名称,但是要用values(字典)[某几列数据]
# q = UserInfo.objects.values('username','password','dp_id','dp','dp__title')
#query[{'username':'','password':'',}]

#方法3:获取用户所有的信息,但是要用values_list(元组)
# q = UserInfo.objects.values_list('username','password','dp_id','dp','dp__title')
#query[obj(username,password....),obj(),....]

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

后台样式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        .header{
            width: 100%;
            height: 48px;
            background-color: darkblue;
            position: fixed;
            top: 0;
            left: 0;
        }

        .left{
            width: 200px;
            position: absolute;
            top:48px;
            left: 0;
            bottom: 0;
            background-color: lightpink;

        }

        .right{
            position: absolute;
            top: 48px;
            bottom: 0;
            left: 200px;
            right: 0;
            overflow: scroll;

        }

        .left a{
            display: inline-block;
            width: 70px;
            padding: 10px;
            background-color: green;
            color: white;
        }
    </style>
</head>
<body>

<div class="header"></div>
<div class="box">
     <div class="left">
         <a href="/addArticle/">继承</a>
         <a href="/addArticle2/">添加文章</a>

     </div>
     <div class="right">
         {% block content %}
             <h1>yyyyyyyyyyyyyyyyyyyyyyyyyyy</h1>
         {% endblock %}
         {% block content2 %}
             <h1>yyyyyyyyyyyyyyyyyyyyyyyyyyy</h1>
         {% endblock %}
         {% block content3 %}
             <h1>hello</h1>
         {% endblock %}
     </div>
</div>


</body>
</html>

补:图一
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值