欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ORM(1)转载

程序员文章站 2022-06-20 12:23:00
...

博客核心内容:


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

表结构展示:
ORM(1)转载

程序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(),....]

ORM(1)转载
ORM(1)转载
ORM(1)转载
ORM(1)转载
ORM(1)转载

后台样式:

<!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>

补:图一
ORM(1)转载

相关标签: ORM