六、基于对象的跨表查询

正向与反向查询

关键在于ForeignKey字段写的位置。例如下面这段代码,

关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的数据叫做正向查询,反之叫做反向查询

  1. Publish查询Book的内容就是反向查询
  2. Book查询Publish的内容就是正向查询

5.png

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()