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'))
我正在尝试根据不区分大小写的外键字段对查询进行排序。 我的模型是:
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'))