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

Django ORM如何通过分类名称而非主键过滤产品数据?

解决方案

你可以直接通过Django ORM的跨关联查询语法,实现按分类精确名称过滤产品,完全不需要依赖分类主键值。

核心查询代码

你的product模型通过外键关联了category模型,查询时使用双下划线__拼接关联模型的目标字段即可,要查询分类名为home的所有产品,写法如下:

p = product.objects.filter(category__name="home")

注意:传入的分类名称是字符串类型,必须加引号,直接写home会被Python识别为未定义变量,触发运行错误。

语法说明

  • __是Django ORM的固定语法,用来访问关联模型的字段、指定查询规则,category__name表示匹配当前产品关联的分类对象的name字段
  • 你已经给category.name字段加了db_index=True数据库索引,这个查询的执行效率和直接用主键过滤没有明显差异,不会产生性能问题
  • 上述写法是精确匹配,只有分类名称和传入字符串完全一致时才会返回对应产品,完全符合你的过滤需求

可选优化(高频查询场景)

如果你后续需要频繁按分类名查询产品,可以给产品模型自定义管理器方法,简化重复代码:

class ProductCategoryManager(models.Manager):
    def filter_by_category_name(self, c_name):
        return self.filter(category__name=c_name)

class product(models.Model):
    category = models.ForeignKey(category, related_name='products',on_delete=models.CASCADE) 
    image=models.CharField(max_length=500)
    description=models.CharField(max_length=500)
    price=models.CharField(max_length=50)
    buy=models.CharField(max_length=100)
    # 绑定自定义管理器
    objects = ProductCategoryManager()

# 后续查询可以直接简写为
p = product.objects.filter_by_category_name("home")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:18:30