首页 > 解决方案 > django ordered_by 反转不同

问题描述

我编辑了我以前的帖子,所以也许更容易理解:

我有以下型号

class Course(models.Model):
 name = models.Charfield(max_length=255)

class CourseDay(models.Model):
 course = models.ForeignKey(Course)
 date = models.DateField()

对于我的视图,我过滤所有对象,如下所示:

courses = Course.objects.filter(models.Q(courseday__date__gt=date_filter) |
                                models.Q(courseday__isnull=True))

这为我提供了给定过滤器的所有匹配课程。这可能包括为每个匹配的课程日多次开设一门课程。2 天课程和 1 天课程的结果可能如下所示:

<QuerySet [<Course: 5 test>, <Course: 9 Latex>, <Course: 5 test>]> 

为了摆脱重复,我使用以下过滤器:

courses = Course.objects.filter(models.Q(courseday__date__gt=date_filter) |
                                models.Q(courseday__isnull=True)).distinct()

我得到了我的课程查询集,没有任何重复。现在我想按相关 CourseDays 的日期订购这个查询集。

我有两个选择。第一个是:

courses.order_by("courseday__date")

第二个是编辑 Course 类并添加一个 Meta 类。

class CourseDay(...):
 ...
 class Meta:
  ordering= ["courseday__date"]

这两个选项都像我想要的那样对数组进行排序,但是如果我记录我的查询集,我会变成这样:

<QuerySet [<Course: 5 test>, <Course: 9 Latex>, <Course: 5 test>]> 

现在,如果我在该查询集上使用 distinct 或使用它,它不会过滤掉重复项。我知道我可以例如首先对 QS 进行排序并手动过滤所有重复项,但我感觉不合适。

标签: pythonmysqldjangodjango-modelsdjango-views

解决方案


我仍然真的不明白为什么这不起作用。由于我必须继续我的工作,我决定采用以下解决方案:

要删除重复项,我将使用 distinct 而不只对查询集进行排序。为了对 QuerySet 进行排序,我将其转换为列表,并仅用于排序功能,如下所示:

date_filter = date.today() - relativedelta(months=3)
courses = Course.objects.filter(models.Q(courseday__date__gt=date_filter) |
                                models.Q(courseday__isnull=True)).distinct()
courses = list(courses)
courses.sort(key=lambda x: (x.get_first_date() is None, x.custom_id), reverse=True)

它工作正常并且做了它应该做的事情,但我仍然不明白为什么 distinct 和 orded_by 与相关字段的组合不起作用。干杯


推荐阅读