Допустим, я хочу иметь коллекции книг и в каждой коллекции книги, отсортированные по уникальному рейтингу.
Одна простая реализация может выглядеть так:
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'))
Это работает нормально, но главная проблема в том, что если я хочу переупорядочить коллекцию новым, другим способом, с учетом ограничений уникальности. Например, скажем, в некоторой коллекции
- Война и мир
- Преступлениеи наказание
- Игрок
- По ком звонит колокол
- Моби Дик
И мы хотим изменить порядок на
- Моби Дик
- По ком звонит колокол
- Моби Дик
- Преступление и наказание
- Игрок
Как мы можем это сделать?Простая попытка переназначить ряды, такие как Moby Dick = 1, потерпит неудачу, потому что уже будет членство с рангом 1 («Война и мир»), и уникальные ограничения запретят это.Возможно, мне придется каким-то образом менять все ранги одновременно?
В итоге я просто удаляю все Memberships
коллекции каждый раз, когда хочу изменить порядок, и заново создаю их с новымряды, но это не очень эффективно.Читая вокруг, я задаюсь вопросом, поможет ли мне подход из связанного списка из этого беспорядка?Если да, то как это будет работать именно с приведенным выше примером?
Есть еще идеи?