我在同一应用中有2种不同的型号
class Book(models.Model):
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=50)
description = models.TextField(max_length=500)
class Chapter(models.Model):
book = models.ForeignKey(Book,on_delete=models.CASCADE)
num = models.PositiveIntegerField(verbose_name="Chapter Number")
rdate = models.DateTimeField(verbose_name="Release Date", default=timezone.now)
我想做的是按发行日期rdate
降序排列所有书籍
我试过的是:
Book.objects.all().order_by('-chapter__rdate').distinct()
结果发现有一些重复,我只添加了2本书,所以只有1本书被重复。结果是这样的:Book1,Book2,Book2
我已经看过here中的注释,并且我正在使用SQLite。 通过使用values(),我将无法调用get_absolute_url()和其他一些我想调用的方法,因此使用values()毫无疑问。
接下来,我尝试将Chapter rdate注释成这样的Book查询
Book.objects.all().annotate(bdate=ExpressionWrapper(F('chapter__rdate'), output_field=DateTimeField())).order_by('-bdate').distinct()
仍然以相同的结果结束。我完全迷路了,请需要帮助。我现在可能不会更改为PostgreSQL,但是在部署应用程序时可能会使用它,因此,如果可能的话,我希望同时使用SQLite版本和PostgreSQL版本解决方案。 SQLite解决方案对我来说绝对必要,因为它易于在开发中使用。
答案 0 :(得分:1)
您可以尝试
Chapter.objects.values('book__title').distinct()
这将返回至少包含一章的书籍。
答案 1 :(得分:1)
您应该尝试如下操作:
Book.objects.all().order_by('-chapter__rdate').distinct('chapter__rdate')
这将为您提供一个不同的chapter_rdate
。
答案 2 :(得分:0)
我尝试过此方法后就工作了:
Book.objects.all().annotate(ch_date=Max('chapter__rdate')).order_by('-ch_date')
感谢所有帮助。