浅谈 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,都一样的用法

原文地址:https://www.cnblogs.com/xiaohuyi/p/10282587.html