zoukankan      html  css  js  c++  java
  • ORM正向和反向查询

    表结构

    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='ooxx')

    插入数据

    # 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
    # Publisher表
    id name 1 出版社1 2 出版社2 3 出版社3

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

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

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

    book_obj = models.Book.objects.all()  # 取到书籍对象
    book_obj.publisher.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)
  • 相关阅读:
    saltstack配置详解
    前端html&Css快速入门...
    pymysql实现注册登录
    Mysql学习入门到放弃ing...
    python学习之选课系统项目(面向对象)
    python 面向对象和类
    python开发三层架构
    python 查看某个文件下最新更新的日期文件
    python写小说阅读功能~
    删除链表中重复的结点
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9520832.html
Copyright © 2011-2022 走看看