1

我有以下两种电影和电视标题的模型:

Title
    - id
    - title
    - show_name (FK, Nullable)

TVShow
    - id
    - title

以下是一些示例数据条目:

Episode_Title
- (1, "Terminator", NULL)
- (2, "ZZZ", 1) --> FK to TVShow (1, "Seinfeld")
- (3, "Abyss", NULL)

以下是它的排序方式:

- Abyss (sort by episode title if show NULL)
- Seinfeld - ZZZ (sort by show title if show NOT NULL)
- Terminator (sort by title if show NULL)

我将如何使用 django QuerySet 来做到这一点?我现在所拥有的,这是不正确的——

Title.objects.filter('title', 'show__title')
4

1 回答 1

2

我想你想要:

Title.objects.select_related().extra(
    select={'sort_title':"COALESCE(`tv_show`.`title`, `title`.`title`)"},
    order_by=['sort_title']
)

所以你在SELECT子句中添加一个“虚拟”字段,COALESCE会给你第一个非空值,所以 sort_title 将是电视节目的标题(如果有),或者是常规标题。然后你可以按你给它的名字排序。这样select_related()连接是在 1 个查询中完成的,我不确定表名是什么,但您可以从那里获取它......

于 2013-05-21T19:25:58.527 回答