如何在Django中通过父模型slug单查询获取子模型数据?
问题解答:通过咖啡店Slug直接关联查询商品
完全可以直接用单条QuerySet实现,不需要先查询咖啡店主键,你的代码写法本身就是正确的。
核心原理
Django ORM支持跨关系的字段过滤,通过双下划线__可以直接关联外键关联的模型字段进行查询。你代码里的Item.objects.filter(cafe__slug=cafe_slug)就是标准用法:ORM会自动生成关联SQL,通过Item表的外键字段关联到CoffeeShop表,用传入的slug值筛选出对应的商品数据,全程不需要手动查询咖啡店主键。
你的代码验证
- URL配置:正确接收了
cafe_slug字符串参数,路由指向对应的视图 - 视图逻辑:
filter(cafe__slug=cafe_slug)的写法完全符合Django ORM的查询规范,会返回所有属于该slug对应咖啡店的商品 - 模型结构:Item通过外键关联CoffeeShop,且CoffeeShop的slug字段设置了唯一约束,保证了查询的准确性
可选优化建议
- 改用SlugField存储slug:CoffeeShop的slug字段可以替换为
models.SlugField,它专门针对slug格式字符串设计,会自动处理小写转换、特殊字符替换等逻辑,更贴合slug的使用场景:class CoffeeShop(models.Model): name = models.CharField(max_length=256, unique=True) slug = models.SlugField(max_length=256, unique=True,) - 增加存在性检查(可选):如果业务要求当slug不存在时返回404而非空列表,可以先验证咖啡店存在性,再查询商品,效率和直接关联查询几乎一致:
from django.shortcuts import get_object_or_404 def get(self, request, cafe_slug): cafe = get_object_or_404(CoffeeShop, slug=cafe_slug) queryset = Item.objects.filter(cafe=cafe)
内容的提问来源于stack exchange,提问作者Montio5
相关产品推荐
相关产品推荐

