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

如何在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字段设置了唯一约束,保证了查询的准确性

可选优化建议

  1. 改用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,)
    
  2. 增加存在性检查(可选):如果业务要求当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:03:29