from django.db import models class Category(models.Model): name = models.CharField(max_length=100) class Meta: db_table = 'category' class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True) def __str__(self): return "<(Article: id: %s,title: %s, content: %s)>" % (self.id, self.title, self.content) class Meta: db_table = 'article'
from django.http import HttpResponse from .models import Article, Category def index(request): # 查找id为1,2,3的文章 articles = Article.objects.filter(id__in=[1,2,3]) for article in articles: print("%s, %s, %s"%(article.id, article.title, article.content)) # 1, Hello, 你好 # 2, Hello World, 你们好 # 3, 钢铁是怎样炼成的, 你好 # 打印出sql语句: print(articles.query) # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` IN (1, 2, 3) return HttpResponse("success")
def index(request): # in:查找id为1,2,3的文章的分类 # 涉及到两个表 # 父表Category能够经过子表名字的小写形式进行访问子表,一样若是不想使用默认的名字进行访问, # 能够在指定外键的时候指定参数related__query__name='articles',以后就能够经过articles进行访问子表了。 categorys = Category.objects.filter(article__id__in=[1,2,3]) # 若是你判断的模型的字段就是模型的主键,那么就能够使用article__in categorys = Category.objects.filter(article__in=[1,2,3]) for category in categorys: print("%s, %s"%(category.id, category.name)) # 1, 最新文章 # # 2, 最热文章 # 3, 高评分文章 print(categorys.query) # SELECT `category`.`id`, `category`.`name` FROM `category` INNER JOIN `article` ON (`category`.`id` = `article`.`category_id`) WHERE `article`.`id` IN (1, 2, 3) return HttpResponse("success")
# 查找标题中包含“hello”的文章的分类 # 首先将标题中包含hello的文章查询出来 articles = Article.objects.filter(title__icontains="hello") # 以后查找这些文章的分类 categorys = Category.objects.filter(article__id__in=articles) for category in categorys: print(category) # Category object (1) # Category object (2) print(categorys.query) # SELECT `category`.`id`, `category`.`name` FROM `category` INNER JOIN `article` ON (`category`.`id` = `article`.`category_id`) WHERE `article`.`id` IN (SELECT U0.`id` FROM `article` U0 WHERE U0.`title` LIKE %hello%) return HttpResponse("success")
总结:1. 在父表(category)对子表(article)进行反向查询的时候,默认状况下能够经过子表名字的小写形式进行查询。若是不想使用默认的,一样能够在定义外键的时候,指定参数related_query_name='articles',以后就能够使用articles进行反向查询子表了。
2. 父表对子表进行反向引用,默认状况下能够经过“子表的名字的小写形式_set”进行反向引用。若是不想使用默认的这种形式,一样能够在定义外嫁的时候指定参数related_name='articles',以后就能够经过articles进行反向引用了。python