我试图根据外键字段不区分大小写来对查询进行排序。 我的模特是:
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字段不区分大小写来对帖子对象进行排序。
我知道如果我想对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')
我收到错误"没有这样的专栏:book__boot_title"
我想知道我做错了什么。感谢
答案 0 :(得分:1)
我遇到了同样的问题。这是你应该做的:
from django.db.models.functions import Lower
posts = Post.objects.filter(trade_option= 'buy').order_by(Lower('title'))
答案 1 :(得分:0)
像book__book_title
这样的相关查找仅适用于Django的上下文。 Django不会处理extra
中的任何内容,因此这些查找无法正常工作。您必须显式从相关表中获取结果。
请注意,您尝试定义的顺序很可能不是您所期望的顺序:Post
对象可以包含多个相关的Book
个对象。按book__book_title
(手动或通过orm)排序可以为您提供不确定的排序或重复行,具体取决于查询的确切详细信息。您需要定义哪些相关的book_title
帖子应该按顺序排列。