Django中filter(category__slug=category)的category__slug含义是什么?
问题解答
category__slug是Django ORM双下划线语法中跨关联模型查询的标准写法,和你见过的__gt、__exact同属双下划线语法体系,只是适用场景不同:
- 语法规则前提
你的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参数」的所有文章。
- 双下划线用法区分
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
相关产品推荐
相关产品推荐

