如何在Django select_related中获取关联模型的指定字段
Django ORM限定关联模型查询字段解决方案
以下是可正常运行的实现方案,可根据你的实际业务场景选择:
- 方案1:保留原查询的
billing_addr、cart全量关联数据,仅裁剪shipping_addr的返回字段
注意only()方法需要显式声明所有你业务中会用到的主模型字段、其他关联模型标识、目标关联模型的指定字段,否则会触发额外查询或报错:qs = self.model.objects \ .filter(user=self.request.user, pk__iexact=pk) \ .select_related('shipping_addr', 'billing_addr', 'cart') \ .only( # 此处替换为你实际需要用到的所有主模型字段 'id', 'order_sn', 'create_time', # 保留其他关联模型的全量查询 'billing_addr', 'cart', # 仅查询shipping_addr的指定字段 'shipping_addr__id', 'shipping_addr__name' ) \ .first() - 方案2:不需要
billing_addr、cart关联数据,进一步优化查询性能
直接移除不需要的关联查询,减少多表关联损耗:qs = self.model.objects \ .filter(user=self.request.user, pk__iexact=pk) \ .select_related('shipping_addr') \ .only( # 此处替换为你实际需要用到的所有主模型字段 'id', 'order_sn', 'shipping_addr__id', 'shipping_addr__name' ) \ .first() - 方案3:仅需要
shipping_addr的两个字段,不需要主模型实例对象
直接用values()/values_list()返回结构化数据,性能最高:# 返回字典格式 addr_info = self.model.objects \ .filter(user=self.request.user, pk__iexact=pk) \ .values('shipping_addr__id', 'shipping_addr__name') \ .first() # 返回元组格式,可直接解包 addr_id, addr_name = self.model.objects \ .filter(user=self.request.user, pk__iexact=pk) \ .values_list('shipping_addr__id', 'shipping_addr__name') \ .first()
注意事项:如果
shipping_addr为可空外键,需对查询结果做判空处理,避免访问字段时抛出异常。
内容的提问来源于stack exchange,提问作者Shayestehhs
相关产品推荐
相关产品推荐

