Задать вопрос
@NyxDeveloper

Как отсортировать queryset по связанным полям OneToOne на эту же таблицу?

Добавляю в свой проект что-то наподобие встроенной 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.
Проблемой является то, что при большом размере таблицы задач, вычисление позиции будет занимать очень много времени.
Если есть идеи того, как можно быстро отсортировать такой список (желательно одним запросом к базе данных), помогите советом или идеей.
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы