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

时间:2015-01-18 15:20:51

标签: django foreign-key-relationship django-queryset

我试图根据外键字段不区分大小写来对查询进行排序。 我的模特是:

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"

我想知道我做错了什么。感谢

2 个答案:

答案 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帖子应该按顺序排列。