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
相关产品推荐
相关产品推荐

