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

时间:2019-01-30 13:18:33

标签: django django-queryset django-orm

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

3 个答案:

答案 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')

感谢所有帮助。

相关问题