表结构
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 age1 作者1 1 2 作者2 2 3 作者3 3
正向查询: 外键所在表去查另一张表,Book >> Person
反向查询:普通表去查外键所在的表,Person >> Book
正向查询,基于对象跨表查询
book_obj = models.Book.objects.all() # 取到书籍对象book_obj.person.name # 书籍作者名字,htmlbook_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代替表的名字bookbooks = publisher_obj.ooxx_set.all()
基于双下划线
ret = models.Publisher.objects.filter(id=1).values_list(‘person_book__name‘)person_book是通过releted_name给对应关系起的名字,通过person_book就找到了关联的表,再通过双下划线找到nameprint(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)
原文地址:https://www.cnblogs.com/aaronthon/p/9520832.html
时间: 2024-11-05 11:46:54