python条件查询in_64.Python中ORM查询条件:in和关联模型

定义模型的models.py文件中示例代码如下:

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 "" % (self.id, self.title, self.content)

class Meta:

db_table = 'article'

1.in:查找某个字段的数据是否在某个集合中。示例代码如下:

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")

2. in: 查找另一张表中的字段是否在某个集合中。查找id为1,2,3的文章的分类,示例代码如下:

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")

3. 查找标题中包含“hello”的文章的分类,示例代码如下:

# 查找标题中包含“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进行反向引用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值