You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中filter(category__slug=category)的category__slug含义是什么?

问题解答

category__slug是Django ORM双下划线语法中跨关联模型查询的标准写法,和你见过的__gt、__exact同属双下划线语法体系,只是适用场景不同:

  1. 语法规则前提
    你的PostDetail模型(即你代码中PostList允许的子页类型)中必然定义了名为category的外键/多对多关联字段,指向分类模型;而这个分类模型自身有一个名为slug的字段用来存储分类的URL友好标识。
    当你需要根据关联模型的字段值做筛选时,就可以用关联字段名__关联模型字段名的写法,Django ORM会自动完成联表查询逻辑,不需要手动写SQL JOIN语句。

举个对应场景的模型示例:

# 分类表模型
class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True) # 分类的唯一字符串标识

# 文章详情模型
class PostDetail(Page):
    # 关联分类表,关联字段名为category
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    # 其他字段省略

你代码中的filter(category__slug=category),作用就是筛选出「关联分类的slug字段值等于路由传入的category参数」的所有文章。

  1. 双下划线用法区分
    Django的双下划线核心有两类常见用法,避免混淆即可:
  • 单表字段查询规则声明:当前模型字段名__查询规则,比如create_time__gt=xxx(创建时间大于指定值)、title__exact=xxx(标题完全匹配)
  • 跨关联模型字段查询:关联字段名__[多级关联字段名__]目标查询字段,支持多层跨表,比如要查询分类所属的父分类的slug,就可以写category__parent__slug=xxx

另外注意你当前代码里的get_posts方法存在笔误:PostList.objects.descendant_of(self)查询的是PostList类型的子页,和你设定的子页类型PostDetail不符,建议改为查询PostDetail的QuerySet。


内容的提问来源于stack exchange,提问作者Yan Tian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 01:12:02