Django предоставляет очень простой механизм с помощью мета-опций модели, а именно order_with_respect_to .Я полагаю, что его использование уже облегчит задачу:
class Question(models.Model):
questionnaire = models.ForeignKey(Questionnaire)
# ...
class Meta:
order_with_respect_to = 'questionnaire'
Это добавляет два метода к модели Questionnaire
.Оба позволяют обрабатывать порядок объектов Question
, используя список Question
первичных ключей.
Получить заказ
questionnaire = Questionnaire.objects.get(id=1)
questionnaire.get_question_order()
[1, 2, 3]
Установить порядок
questionnaire.set_question_order([3, 1, 2])
Обратите внимание, что эта операция добавит столбец _order
в базу данных и неявно установит ordering
для ее использования.
Теперь вы можете реализовать всю дальнейшую бизнес-логику, манипулируя списком заказов.Просто примерный помощник для поиска порядка Question
объекта:
questionnaire = Questionnaire.objects.get(id=1)
question_order = questionnaire.get_question_order()
question = Question.objects.get(foo='bar')
position = question_order.index(question.pk)
Я не уверен, стоит ли вам идти по этому пути (используя поле order
), но если вы это сделаете,по крайней мере, используйте PositiveIntegerField
и ограничьте его быть уникальным.Я не знаю, откуда поступают ваши входные данные, но вы всегда должны пытаться санировать их в последовательности, бросать их в список, а затем устанавливать порядок объектов Question
сразу.