Заказать объекты в поле ManyToMany - PullRequest
0 голосов
/ 07 ноября 2018

gt.tests - поле ManyToMany с моделью Test. Мне нужно отсортировать тесты по этому странному алгоритму, но вопрос в другом. После всех операций я получаю отсортированный список тестов и добавляю их в поле ManyToMany. Но когда я беру тесты значений из этого поля, они отображаются в порядке от самого маленького теста id до самого большого. Как добавить тесты в это поле в моем заказе?

    tests = Test.objects.all()
    gt = GroupTest.objects.create(title=name, user=user)

    #code

    import random
    tests_array = []
    tests_go = []

    for reading in ReadingForTest.objects.all():
        if tests.filter(reading=reading).count() != 0:
            tests_array.append(tests.filter(reading=reading))

    tests_list = tests.filter(reading__isnull=True)

    while len(tests_list) > 0:
        number = random.randint(0, 5)
        tests_array.append(tests_list[:number])
        tests_list = tests_list[number:]

    seq = [x for x in range(len(tests_array))]

    random.shuffle(seq)

    for i in seq:
        tests_go.extend(tests_array[i])

    tests_go = tests_go[:number_of_questions]

    print_arr = []
    for test in tests_go:
        print_arr.append(test.id)
        gt.tests.add(test)

    print(print_arr)
    print([x.id for x in gt.tests.all()])

Вывод скриншота здесь

1 Ответ

0 голосов
/ 08 ноября 2018

Вы должны использовать сквозную модель.

Пример использования сквозной модели:

class Question(models.Model):
    value = models.TextField()

class Test(models.Model)
    value = models.TextField()
    questions = models.ManyToManyField(Question, related_name="tests", through="QuestionTest")

class QuestionTest(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    sort_field = models.IntegerField(default=0)

При вставке в модель QuestionTest вам необходимо указать поле sort_, а при получении тестов, связанных с вопросом, вы должны использовать что-то вроде этого.

Question.objects.get(id=1).tests.all().order_by("questiontest__sort_field")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...