Удаление дубликатов по порядку по полям из связанной модели - PullRequest
0 голосов
/ 30 января 2019

У меня есть 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

Я уже видел заметку от здесь , и я использую SQLite.Используя values ​​(), я не смогу вызвать get_absolute_url () и некоторые другие методы, которые я хочу вызвать, поэтому использование values ​​() не подлежит обсуждению.

Далее я попытался аннотировать главу rdateв запрос к книге, подобный этому Book.objects.all().annotate(bdate=ExpressionWrapper(F('chapter__rdate'), output_field=DateTimeField())).order_by('-bdate').distinct()

Все еще закончился тем же результатом.Я полностью потерян, пожалуйста, нужна помощь.Я, вероятно, не буду сейчас переходить на PostgreSQL, но я мог бы использовать его при развертывании приложения, поэтому я хочу, чтобы это было возможно как для версии SQLite, так и для версии PostgreSQL, если это возможно.Решение SQLite абсолютно необходимо для меня, так как его легко использовать в разработке.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Вы должны попробовать, как показано ниже:

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

Это даст вам другое chapter_rdate.

0 голосов
/ 31 января 2019

Сработало после того, как я попробовал это:

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

Спасибо за помощь.

0 голосов
/ 30 января 2019

Вы можете попробовать это

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

Это вернет книги, у которых есть хотя бы одна глава.

...