python - 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 进行排序并手动过滤所有重复项,但我感觉不合适。
解决方案
我仍然真的不明白为什么这不起作用。由于我必须继续我的工作,我决定采用以下解决方案:
要删除重复项,我将使用 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 与相关字段的组合不起作用。干杯
推荐阅读
- angular - 运行“ng serve”时抛出“复合选择器可能不再被扩展”错误。
- reactjs - Tone.js 中的路径和采样器循环
- javascript - React Native 中的 Expo-camera 无法正常工作
- python - 什么是 __methodName__(self) 方法?是私有方法吗?
- http - HTTP时间应该如何?
- python-3.x - Python加密request.post的问题
- python - 如何通过 USB 发送一个 gcode 命令?
- python - 从另一个文件继承一个类
- algorithm - 选择性重复确认次数
- java - 如何组合类似的方法?