【问题标题】:Removing duplicates due to order by fields from a related model根据相关模型中的字段顺序删除重复项
【发布时间】:2019-06-23 18:58:28
【问题描述】:

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

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    在我尝试后工作:

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

    感谢大家的帮助。

    【讨论】:

      【解决方案2】:

      你应该尝试如下:

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

      这会给你一个不同的chapter_rdate

      【讨论】:

      • 这是 throw django.db.utils.NotSupportedError: DISTINCT ON fields is not supported by this database backend 你能检查一下吗?
      • 请在从您的子句中删除“-”后尝试。 Book.objects.all().order_by('chapter__rdate').distinct('chapter__rdate') 如果仍然无法正常工作,请分享错误。
      【解决方案3】:

      你可以试试这个

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

      这将返回至少包含一章的书籍。

      【讨论】:

      猜你喜欢
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多