问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django如何查询多个表的数据库表(2023年最新整理)

发布网友 发布时间:2024-10-03 12:28

我来回答

1个回答

热心网友 时间:2024-12-07 12:36

导读:很多朋友问到关于django如何查询多个表的数据库表的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

Django表关联对象及多表查询

首先建立Student,Dpartment,Course,Stu_info表

一对多表关系数据的添加:

1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.

2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象

表关联对象的访问:

Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.

那么如果我们也希望在在访问某个学院的实现对象的学生的时候改怎么访问呢???

表关联对象的访问:

可以在定义时设置related_name参数来覆盖foo_set的名称.

clear()从关联的对象集中删除所有的对象

多表查询----跨关联关系的查询:

Django提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。

Django如何多表联合统计查询

如果你觉着使用自带ORM查询费劲的话。直接获取数据库连接,然后执行sql语句。

defmy_custom_sql():fromdjango.dbimportconnection,transactioncursor=connection.cursor()#数据修改操作——提交要求cursor.execute("UPDATEbarSETfoo=1WHEREbaz=%s",[self.baz])transaction.commit_unless_managed()#数据检索操作,不需要提交cursor.execute("SELECTfooFROMbarWHEREbaz=%s",[self.baz])row=cursor.fetchone()returnrow

多数据

fromdjango.dbimportconnectionscursor=connections['my_db_alias'].cursor()#Yourcodehere...transaction.commit_unless_managed(using='my_db_alias')

通常我们不需要手动调用

transaction.commit_unless_managed(

),我们可以这样做:

@commit_on_successdefmy_custom_sql_view(request,value):fromdjango.dbimportconnection,transactioncursor=connection.cursor()#Datamodifyingoperationcursor.execute("UPDATEbarSETfoo=1WHEREbaz=%s",[value])#Sincewemodifieddata,markthetransactionasdirtytransaction.set_dirty()#Dataretrievaloperation.Thisdoesn'tdirtythetransaction,#sonocalltoset_dirty()isrequired.cursor.execute("SELECTfooFROMbarWHEREbaz=%s",[value])row=cursor.fetchone()returnrender_to_response('template.html',{'row':row})

python+django多表联合查询方法求教

先让我们回忆一下在第五章里的关于书本(book)的数据模型:

1

fromdjango.dbimportmodels

classPublisher(models.Model):

name=models.CharField(max_length=30)

address=models.CharField(max_length=50)

city=models.CharField(max_length=60)

state_province=models.CharField(max_length=30)

country=models.CharField(max_length=50)

website=models.URLField()

def__unicode__(self):

returnself.name

classAuthor(models.Model):

first_name=models.CharField(max_length=30)

last_name=models.CharField(max_length=40)

email=models.EmailField()

def__unicode__(self):

returnu'%s%s'%(self.first_name,self.last_name)

classBook(models.Model):

title=models.CharField(max_length=100)

authors=models.ManyToManyField(Author)

publisher=models.ForeignKey(Publisher)

publication_date=models.DateField()

def__unicode__(self):

returnself.title

如我们在第5章的讲解,获取数据库对象的特定字段的值只需直接使用属性。例如,要确定ID为50的书本的标题,我们这样做:

frommysite.books.modelsimportBook

b=Book.objects.get(id=50)

b.title

u'TheDjangoBook'

但是,在之前有一件我们没提及到的是表现为ForeignKey或ManyToManyField的关联对象字段,它们的作用稍有不同。

访问外键(ForeignKey)值

当你获取一个ForeignKey字段时,你会得到相关的数据模型对象。例如:

b=Book.objects.get(id=50)

b.publisher

Publisher:ApressPublishing

b.publisher.website

u''

对于用``ForeignKey``

来定义的关系来说,在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。通过一个``publisher``对象,直接获取

books,用publisher.book_set.all(),如下:

p=Publisher.objects.get(name='ApressPublishing')

p.book_set.all()

[Book:TheDjangoBook,Book:DiveIntoPython,...]

实际上,book_set只是一个QuerySet(参考第5章的介绍),所以它可以像QuerySet一样,能实现数据过滤和分切,例如:

1

p=Publisher.objects.get(name='ApressPublishing')

p.book_set.filter(name__icontains='django')

[Book:TheDjangoBook,Book:ProDjango]

属性名称book_set是由模型名称的小写(如book)加_set组成的。

访问多对多值(Many-to-ManyValues)

多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。例如,这里是如何查看书籍的作者:

b=Book.objects.get(id=50)

b.authors.all()

[Author:AdrianHolovaty,Author:JacobKaplan-Moss]

b.authors.filter(first_name='Adrian')

[Author:AdrianHolovaty]

b.authors.filter(first_name='Adam')

[]

反向查询也可以。要查看一个作者的所有书籍,使用author.book_set,就如这样:

a=Author.objects.get(first_name='Adrian',last_name='Holovaty')

a.book_set.all()

[Book:TheDjangoBook,Book:Adrian'sOtherBook]

这里,就像使用ForeignKey字段一样,属性名book_set是在数据模型(model)名后追加_set。

更改数据库模式(DatabaseSchema)

3

在我们在第5章介绍syncdb这个命令时,我们注意到syncdb仅仅创建数据库里还没有的表,它并不对你数据模型的修改进行同步,也不处理数据模型的删除。如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改。这段将解释了具体怎么做:

当处理模型修改的时候,将Django的数据库层的工作流程铭记于心是很重要的。

如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。当你第一次用Django的数据库API请求表中不存在的字段时会导致错误(就是说,它会在运行时出错,而不是编译时)。

3

Django不关心数据库表中是否存在未在模型中定义的列。

Django不关心数据库中是否存在未被模型表示的表格。

1

改变模型的模式架构意味着需要按照顺序更改Python代码和数据库。

添加字段

1

当要向一个产品设置表(或者说是model)添加一个字段的时候,要使用的技巧是利用Django不关心表里是否包含model里所没有的列的特性。策略就是现在数据库里加入字段,然后同步Django的模型以包含新字段。

3

然而这里有一个鸡生蛋蛋生鸡的问题,由于要想了解新增列的SQL语句,你需要使用Django的

manage.pysqlall命令进行查看,而这又需要字段已经在模型里存在了。(注意:你并不是非得使用与Django相同的SQL语句创建新的字段,但是这样做确实是一个好主意,它能让一切都保持同步。)

3

这个鸡-蛋的问题的解决方法是在开发者环境里而不是发布环境里实现这个变化。(你正使用的是测试/开发环境,对吧?)下面是具体的实施步骤。

首先,进入开发环境(也就是说,不是在发布环境里):

在你的模型里添加字段。

运行manage.pysqlall[yourapp]来测试模型新的CREATETABLE语句。注意为新字段的列定义。

开启你的数据库的交互命令界面(比如,psql或mysql,或者可以使用

manage.pydbshell)。执行ALTERTABLE语句来添加新列。

使用Python的manage.pyshell,通过导入模型和选中表单(例如,

MyModel.objects.all()[:5])来验证新的字段是否被正确的添加,如果一切顺利,所有的语句都不会报错。

3

然后在你的产品服务器上再实施一遍这些步骤。

启动数据库的交互界面。

5

执行在开发环境步骤中,第三步的ALTERTABLE语句。

将新的字段加入到模型中。如果你使用了某种版本控制工具,并且在第一步中,已经提交了你在开发环境上的修改,现在,可以在生产环境中更新你的代码了(例如,如果你使用Subversion,执行svnupdate。

重新启动Webserver,使修改生效。

让我们实践下,比如添加一个num_pages字段到第五章中Book模型。首先,我们会把开发环境中的模型改成如下形式:

classBook(models.Model):

title=models.CharField(max_length=100)

authors=models.ManyToManyField(Author)

publisher=models.ForeignKey(Publisher)

publication_date=models.DateField()

**num_pages=models.IntegerField(blank=True,null=True)**

def__unicode__(self):

returnself.title

django多表查询,如何让select语句包含多表的所有字段?

select*from(select....fromagroupby班次)asA,(select....frombgroupby班次)asB

WHEREA.班次=B.班次

如果是多个字段合为主键,那就用and连起来.

结语:以上就是首席CTO笔记为大家整理的关于django如何查询多个表的数据库表的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
净水鱼有哪些 全民k歌歌曲转发到哪了 PC端和移动端在传播上有什么的区别?它们各自的优势是什么? PC端产品跟移动端产品的区别在哪? 我现在很瘦是什么原我很瘦? 服装厂有哪些岗位职称 电视会员怎么取消? 存货舞弊应对 存货舞弊手段 审计论文选题50篇分享 django怎么判断数据库的改变(2023年最新解答) django怎么页面显示数据库数据库(2023年最新解答) ...医生这种情况属于高血压吗?需要吃药吗?100/160或90/140 网易区块链有哪些平台可靠(易币网平台怎么样) django怎么连接数据库查询(2023年最新分享) Django如何实时查询数据库(2023年最新分享) 跑货车之前做梦梦到前几天给别人跑车的时候有什么说法吗? 问高血压/高压160-90 血压的高度要吃药吗?最近体重突然在两个多月胖... 昨天晚上做了一个梦,梦到一个小学同学开着一辆超级跑车来见我,可以... ...血压高 血压90--160 需要吃药物吗?是老人60岁了。需要注意什么事项... 我的苹果8p抖音不清晰是怎么回事呢? 塔顶上的猫作者简介 - 塔顶上的猫 杨红樱是哪个系列淘气包马小跳的作者? 淘气包马小跳作者介绍 黑米粥的五种做法,简单又好喝! 樱桃沟的春天作者简介 荣耀V20怎样解决杀后台问题? 什么是x86, c86? 飞来飞去落谁家。洛阳女儿惜颜色。坐见落花长叹息。今年花落颜色改... 女儿惜颜色指什么动物? 菜鸟购相机:长焦旗舰还是低端长焦? 腾讯文档怎么设置多人协作编辑? ...穷人,单反就算了。本人是菜鸟,请问长焦机跟卡片机有什么区别是什么... 凉水的词性凉水的词性是什么 NET是什么简称 为什么信托贷款额度受限制 信托委托贷款规定是什么 IMF信托基金取得信托资金贷款的条件 西安旅游3天,大概1号中午到,3号下午离开,请各位帮忙设计一下行程路线... ...五日自助游住桂林还是阳朔?五月三十一号中午到桂林帮忙日程安排指 ... ...用什么牌子的防晒霜和镇定修护露比较好,价格适中,最好是有用过的朋... 2011款奔腾B70的2.0,手动最低配,最便宜得多少钱?这车怎么样啊?_百度知 ... ...里的垃圾文件时,不知道删了什么,手机腾讯管家里私密空间的照片全部... 依视路眼镜妨蓝光有假货吗给孩子配了防蓝光的依视路眼镜,店家一开始眼 ... 急急.卸载手机管家导致私密空间里的照片被删,还能恢复吗?我又把手机... 你好,我手机里的私密照片打不开,我卸载了手机管家再重新安装,就发现私 ... APPLE IPHONE 6S PLUS是什么意思 为什么自从安装了腾讯手机管家之后 图库里的图片都看不了了? 图库里有... 我用的三星手机,自带软件是腾讯手机管家,里面有私密空间。今天我同学帮... 国庆节到了,我想一家三口出去旅游,有那些景点推荐?