Добавляю в свой проект что-то наподобие встроенной trello. Нужно связать позиции элементов на фронте с позициями элементов на бэке.
Модели имеют следующий вид:
class Board(models.Model):
name = models.CharField(verbose_name="Название", max_length=200)
user = models.ForeignKey(AUTH_USER_MODEL, verbose_name="Пользователь", on_delete=models.CASCADE)
class Meta:
verbose_name = "Доска"
verbose_name_plural = "Доски"
def __str__(self):
return self.name
class Column(models.Model):
name = models.CharField(verbose_name="Название", max_length=200)
board = models.ForeignKey("canban.Board", verbose_name="Доска", on_delete=models.CASCADE)
next = models.OneToOneField("canban.Column", on_delete=models.SET_NULL, null=True, default=None, related_name="previous")
class Meta:
verbose_name = "Колонка"
verbose_name_plural = "Колонки"
def __str__(self):
return self.name
class Task(models.Model):
title = models.CharField(verbose_name="Название", max_length=200)
column = models.ManyToManyField("canban.Column")
next = models.OneToOneField("canban.Task", on_delete=models.SET_NULL, null=True, default=None, related_name="previous")
class Meta:
verbose_name = "Задача"
verbose_name_plural = "Задачи"
def __str__(self):
return self.title
Нужно отсортировать колонки и задачи в колонках соответственно их
next
и
previous
.
Понятно, что первым будет элемент, у которого нет
previous
, а последним - тот, у которого нет
next
. Так же понятно, что позиция каждого элемента - это количество обращений к его
previous
до момента, пока
previous
не станет
null
.
Суть задачи заключается в том, чтобы зная
next
или
previous
любого элемента в любой момент получить его позицию в виде целого числа чтобы аннотировать его и отсортировать по нему queryset.
Проблемой является то, что при большом размере таблицы задач, вычисление позиции будет занимать очень много времени.
Если есть идеи того, как можно быстро отсортировать такой список (желательно одним запросом к базе данных), помогите советом или идеей.