从相关模型中删除由于按字段顺序排序的重复项

Removing duplicates due to order by fields from a related model

我在同一个应用程序中有 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 解决方案对我来说是绝对必要的,因为它在开发中很容易使用。

你可以试试这个

Chapter.objects.values('book__title').distinct()

这将 return 本书,其中至少有一章。

你应该像下面这样尝试:

Book.objects.all().order_by('-chapter__rdate').distinct('chapter__rdate')

这会给你一个不同的chapter_rdate

我试过之后成功了:

Book.objects.all().annotate(ch_date=Max('chapter__rdate')).order_by('-ch_date')

感谢大家的帮助。