Хорошо, представьте типичный сценарий, - есть объект потока и комментарии, прикрепленные к нему. Это можно выразить в терминах django ORM примерно так:
class Thread(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
class Comment(models.Model):
id = models.AutoField(primary_key=True)
content = models.TextField()
created = models.DateTimeField(editable=False)
thread = models.ForeignKey(Thread, related_name='comments')
def save(self, force_insert=False, force_update=False):
self.created = datetime.datetime.now()
super(Comment, self).save(force_insert, force_delete)
Таким образом, при отображении фактических данных комментарии будут упорядочены по времени их создания (поскольку я предпочитаю , а не , чтобы предположить, что поле идентичности также гарантирует вам правильный порядок записи).
Но что, если мне нужно было иметь возможность контролировать (и изменять) порядок, в котором комментарии должны появляться в потоке и , чтобы иметь возможность перемещать комментарии из одного потока в другой.
Этого можно достичь, добавив, например, поле «последовательность» к модели комментария и ограничив уникальность комбинации поля «последовательность» и поля «нить» модели комментария (чтобы можно было нет комментариев в потоке с таким же порядковым номером). Уникальный ключ в этих полях должен быть достаточным (с точки зрения django, это может быть выполнено через unique_together
, я думаю).
Однако это добавляет вычислительные издержки (и кодирование: P), потому что если вы хотите изменить порядок комментариев, изменив их порядковые номера, вы также должны обновить комментарии с порядковыми номерами, более высокими, чем целевой порядковый номер комментария. И так далее. Это просто напрашивается на неприятности.
Почему-то, я просто не могу обдумать это. Может быть, я просто что-то упустил?
(Если это возможно, не рассматривайте это как проблему, связанную только с django. IMO, это не зависит от языка, поскольку в нем нет ничего специфичного для django, когда вы об этом думаете)
РЕДАКТИРОВАТЬ: Я вдруг понял, что нет фактического вопроса в вопросе. Таким образом, вопрос в том, что было бы самым легким способом реализации такой модели, помимо очевидного способа, который я описал (мне кажется слишком громоздким).