代码之家  ›  专栏  ›  技术社区  ›  Vladyslav Oliinyk

将字段中的对象排序为多个

  •  0
  • Vladyslav Oliinyk  · 技术社区  · 7 年前

    燃气轮机试验-许多现场模型试验。我需要用这种奇怪的算法对测试进行排序,但问题不同。在所有操作之后,我得到一个排序的测试列表,并将它们添加到manytomy字段中。但是当我从这个字段获取值测试时,它们是按从最小的id测试到最大的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()])
    

    屏幕截图输出 here

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mehran    7 年前

    你应该使用一个贯穿模型。

    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\u字段,当获取与问题相关的测试时,应该使用如下内容。

    Question.objects.get(id=1).tests.all().order_by("questiontest__sort_field")