python项目篇-表查询方式ORM正向和反向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27695659/article/details/88432220

1、表结构

from django.db import models

# Create your models here.
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)

    publisher = models.ForeignKey('Publisher', related_name='person_book', related_query_name=''www")

2、概念

正向查询: 外键所在表去查另一张表,Book >> Publisher

反向查询:普通表去查外键所在的表,Publisher >> Book

3、正向查询,基于对象跨表查询

book_obj = models.Book.objects.all()  # 取到书籍对象
book_obj.publisher.name   # 书籍的出版社名字,
book_obj.person.id   # 书籍的出版社id,

3.1 跨表查询,利用双下划线跨表查询

models.Book.objects.filter(id=1).values('publisher__name')  # 查询id是1的书的出版社的名字,一条双下划线就是跨一张表
models.Book.objects.filter(id=1).values_list('publisher__name')  

4、反向查询

4.1对象查询 obj.表名_set()

publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象
ret = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有数
for i in ret:  # 循环对象
    print(i.name)  # 打印出每一个书的书名
publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象
books = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有书
titles = books.values_list("name")  # 找到第一个出版社出版的所有书的书名
print(titles)
因为使用了releted_name,就是用person_book代替了表字段名字
表字段person = models.ForeignKey(Person, related_name='person_book')
所以这一这样写
books = publisher_obj.person_book.all()
titles = books.values_list('name')
print(titles)
如果表字段person = models.ForeignKey(Person, related_name='person_book',related_query_name="www")
related_query_name="www",这里表示跨表查询xxoo代替表的名字book
books = publisher_obj.www_set.all()

4.2基于双下划线

ret = models.Publisher.objects.filter(id=1).values_list('person_book__name')
person_book是通过releted_name给对应关系起的名字,通过person_book就找到了关联的表,再通过双下划线找到name
print(ret)

猜你喜欢

转载自blog.csdn.net/qq_27695659/article/details/88432220
今日推荐