代码之家  ›  专栏  ›  技术社区  ›  onizukaek

具有共享同一外键的表的django orm内部联接

  •  0
  • onizukaek  · 技术社区  · 8 年前

    我有三张桌子:

    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的模型包含一个链接到 order_status model 但不是 订单状态 ,所以我试着使用

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

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

    但是无论如何,使用django orm管理这样一个请求的好方法是什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Alexandr Tatarinov    8 年前

    我想应该是这样的。

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