Django 使用不区分大小写的外键对对象进行排序

Django sort objects with foreign key case insensitive

我正在尝试根据不区分大小写的外键字段对查询进行排序。 我的模型是:

class Post(models.Model):
title = models.CharField(max_length = 80)
author = models.ForeignKey(User, default = User)
trade_option = models.CharField(max_length= 10)

class Book(models.Model):
book_title = models.CharField(max_length = 60)
post = models.ForeignKey(Post)

我想根据不区分大小写的 book_title 字段对 post 对象进行排序。

我知道如果我想对 Class Post 中的字段不区分大小写进行排序,我可以这样做:

posts = Post.objects.filter(trade_option= 'buy').extra(select = 
    {'lower_name' : 'lower( title )'}).order_by('lower_name')

但是,当我尝试使用相同的技术对具有 book_title 的外键书进行排序时:

posts = Post.objects.filter(trade_option= 'buy').extra(select = 
    {'lower_name' : 'lower( book__book_title )'}).order_by('lower_name')

我收到错误 "no such column: book__boot_title"

我想知道我哪里做错了。谢谢

类似 book__book_title 的相关查找仅适用于 Django 的上下文。 extra 中的任何内容都不会被 Django 处理,因此这些查找将不起作用。您必须明确地从相关 table 中获取结果。

请注意,您尝试定义的顺序很可能不是您所期望的:一个 Post 对象可以有多个相关的 Book 对象。按 book__book_title 排序(手动或通过 orm)可以给你一个不确定的排序或重复的行,这取决于你的查询的具体细节。您需要定义帖子应该按哪些相关 book_title 排序。

我遇到了同样的问题。这是你应该做的:

from django.db.models.functions import Lower

posts = Post.objects.filter(trade_option= 'buy').order_by(Lower('title'))