【问题标题】:Django sort objects with foreign key case insensitiveDjango对具有外键大小写不敏感的对象进行排序
【发布时间】:2015-03-16 16:08:45
【问题描述】:

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

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”

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

【问题讨论】:

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


    【解决方案1】:

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

    from django.db.models.functions import Lower
    
    posts = Post.objects.filter(trade_option= 'buy').order_by(Lower('title'))
    

    【讨论】:

    • 很好的答案,但请记住这是 Django 1.8 中的新功能
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2016-04-13
      相关资源
      最近更新 更多