码迷,mamicode.com
首页 > 其他好文 > 详细

ORM正向和反向查询

时间:2018-08-23 00:29:24      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:date   span   插入数据   信息   object   导入   字段名   外键   基于   

表结构

from django.db import models

# Create your models here.
class Person(models.Model):
    name = models.CharField(verbose_name=作者姓名, max_length=10)
    age = models.IntegerField(verbose_name=作者年龄)


class Book(models.Model):
    person = models.ForeignKey(Person, related_name=person_book)
    title = models.CharField(verbose_name=书籍名称, max_length=10)
    pubtime = models.DateField(verbose_name=出版时间)

插入数据

# Book表
id title pubtime person_id
1 书1 1533225600000 1 2 书2 1533225600000 1 3 书3 1534435200000 1 4 书4 1535644800000 2 5 书5 1535126400000 3
id   name    age
1 作者1 1 2 作者2 2 3 作者3 3

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

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

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

book_obj = models.Book.objects.all()  # 取到书籍对象
book_obj.person.name # 书籍作者名字,html
book_obj.person.id # 书籍作者id,html

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

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

反向查询

对象查询  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="xxoo")
related_query_name="xxoo",这里表示跨表查询xxoo代替表的名字book
books = publisher_obj.ooxx_set.all()

基于双下划线

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

附带django里面脚本的代码

import os

if __name__ == __main__:
    # 加载Django项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
    # 导入Django,并启动Django项目
    import django
    django.setup()

    from app01 import models
    # 查询id为1的出版社出版的所有书的name
    ret = models.Publisher.objects.filter(id=1).values_list(person_book__name)
    print(ret)

 

ORM正向和反向查询

标签:date   span   插入数据   信息   object   导入   字段名   外键   基于   

原文地址:https://www.cnblogs.com/aaronthon/p/9520832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!