zoukankan      html  css  js  c++  java
  • 浅谈 django Models中的跨表

    跨表操作在数据库操作非常常用,虽然其会降低读取数据的性能,但是它能节约数据在硬盘中的占用,优化数据表的结构和各自之间的关系。

    在sql中,一般跨表需要用到 join 关键字

    select * from table1 left join table2 on table1.id = table2.id

    那到了Django框架中,又是如何实现跨表的呢?

    #创建一个类
    class userinfo(Models):
        user_name = models.charField(max_length=32)
        m = models.manytomanyField('usertype')
    
    class usertype(Models):
        name = models.charField(max_length=32)

    通过m,Django内部就会自动生成第三张关系表。

    接下来,该如何对这第三张表进行操作呢?

    #创建一个类
    class userinfo(Models):
        user_name = models.charField(max_length=32)
        m = models.manytomanyField('usertype')
    
    class usertype(Models):
        name = models.charField(max_length=32)
    
    #通过创建一个userinfo的对象,通过对象的m属性进行增删改查
    obj= userinfo()
    obj.m.add()  增加
    obj.m.remove()  删除
    obj.m.set()   更新
    obj.m.clear()  清楚全部数据
    obj.m.all()    查询

    再说说通过外键进行正向查询和反向查询

    #正向
    objs = models.userinfo.objects.values('id','user_name','fk__name')
    for obj in objs:
        obj.fk.name
    
    #反向     小写的表格名__xxx
    objs=models.usertype.objects.values('id','name','userinfo__user_name')
    for obj in objs:
        obj.userinfo__set.all()

    PS:values 可以替换成values_list 和filter,都一样的用法

  • 相关阅读:
    android 2.3 bug android 4.x bug
    设计高性能CSS3动画的几个要素
    开启硬件加速 解决页面闪白 保证动画流畅
    取消input在ios下,输入的时候英文首字母的默认大写 android 上去掉语音输入按钮
    JS中的类型检测
    CSS的一点知识
    HTML Canvas
    HTML DOM Table 对象
    只是有所了解的语言
    骑士巡游问题
  • 原文地址:https://www.cnblogs.com/xiaohuyi/p/10282587.html
Copyright © 2011-2022 走看看