Эффективный повторный заказ ранжированной коллекции в Django - PullRequest
0 голосов
/ 14 июня 2019

Допустим, я хочу иметь коллекции книг и в каждой коллекции книги, отсортированные по уникальному рейтингу.

Одна простая реализация может выглядеть так:

class Book(models.Model):
    title = models.CharField(max_length=100)
​
​
class Collection(models.Model):
    # e.g. adventure, classic, fairy tale, ....
    genre = models.CharField(max_length=100)
​
​
class Membership(models.Model):
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    rank = models.PositiveSmallIntegerField()
​
    class Meta:
        ordering = ('rank',)
        # 1. Can't have same rank twice in a given collection
        # 2. Don't want duplicate books in same collection
        unique_together = (('collection', 'rank'), ('collection', 'book'))

Это работает нормально, но главная проблема в том, что если я хочу переупорядочить коллекцию новым, другим способом, с учетом ограничений уникальности. Например, скажем, в некоторой коллекции

  1. Война и мир
  2. Преступлениеи наказание
  3. Игрок
  4. По ком звонит колокол
  5. Моби Дик

И мы хотим изменить порядок на

  1. Моби Дик
  2. По ком звонит колокол
  3. Моби Дик
  4. Преступление и наказание
  5. Игрок

Как мы можем это сделать?Простая попытка переназначить ряды, такие как Moby Dick = 1, потерпит неудачу, потому что уже будет членство с рангом 1 («Война и мир»), и уникальные ограничения запретят это.Возможно, мне придется каким-то образом менять все ранги одновременно?

В итоге я просто удаляю все Memberships коллекции каждый раз, когда хочу изменить порядок, и заново создаю их с новымряды, но это не очень эффективно.Читая вокруг, я задаюсь вопросом, поможет ли мне подход из связанного списка из этого беспорядка?Если да, то как это будет работать именно с приведенным выше примером?

Есть еще идеи?

1 Ответ

0 голосов
/ 14 июня 2019

Если вы хотите получить только случайный набор запросов, вы можете сделать .order_by('?')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...