五、Django学习之基于对象的跨表查询
五、Django学习之基于对象的跨表查询
正向与反向查询
关键在于ForeignKey
字段写的位置。例如下面这段代码,
关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的数据叫做正向查询,反之叫做反向查询
- Publish查询Book的内容就是反向查询
- Book查询Publish的内容就是正向查询
class Publish(models.Model):
name=models.CharField( max_length=32)
city=models.CharField( max_length=32)
email=models.EmailField() #charfield -- asdfasdf
def __str__(self):
return self.name
#书籍表
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2) #decimal(16,2)
publishs=models.ForeignKey(to="Publish")
authors=models.ManyToManyField(to='Author',)
def __str__(self):
return self.title
一对一
正向查询的例子为 已知用户名,查询用户的电话号码。反向查询例子反之。
正向查询
正向查询靠对象,取到数据对象后,通过点操作符对外键操作,就能拿到外键的对象,从而取到内容
author_obj = models.Author.objects.filter(name='admin').first()
result = author_obj.authorDetail.telephone
反向查询
查到对象后,通过小写的表名来获取另一个表的属性
author_detail_obj = models.AuthorDetail.objects.get(telephone='213')
result = author_detail_obj.author.name
一对多
正向查询
与一对一较为类似
book_obj = models.Book.objects.get(title='第二本书')
result = book_obj.publishs.name
反向查询
注意对象调用的是加_set
的方法,然后all()
即可取出全部内容
publish_obj = models.Publish.objects.get(name="老男人出版社")
result = publish_obj.book_set.all()
多对多
正向查询
book_obj = models.Book.objects.get(title='第一本书')
result = book_obj.authors.all()
反向查询
auth_obj = models.Author.objects.get(name='admin')
result = auth_obj.book_set.all()