Django ORM内连接与表共享相同的外键

时间:2018-06-12 15:14:07

标签: django django-models inner-join

我有三张桌子:

Table 1 : order
Fields: id, client_reference, price and status
(status is a foreignkey linked to order_status.id)

Table 2 : order_status 
Fields: id, lastupdate

Table 3 : order_status_i18n
Fields: id, order_status_id, language and label
(order_status_id is also a foreignkey linked to order_status.id)

我想要做的是根据用户语言获取order_status_i18n label而不是order_status_id,因此SQL请求将如下:

SELECT o.client_reference as reference, o_s_i18n.label 
FROM 
order AS o 
INNER JOIN order_status_i18n AS o_s_i18n 
ON o.status=o_s_i18n.order_status_id WHERE o_s_i18n.language='the language';

并且订单模型包含链接到order_status model但不是order_status_i18n的foreignkey属性,所以我尝试使用

Order.objects.filter(some_filters).prefetch_related('status')
.filter(status__in=OrderStatusI18N.objects.filter(language='the_language'))

这给了我一个查询集冲突,告诉我应该使用OrderStatus而不是OrderStatusI18N的查询集,我完全同意这一点。

但无论如何,使用django ORM管理此类请求的好方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为这应该做的事情。

Order.objects.filter(some_filters).prefetch_related('status').annotate(i18_label=F('status__order_status_i18n__language')).filter(status__order_status_i18n__language='en')