Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中按多个对象的属性排序?_Django_Django Queryset - Fatal编程技术网

如何在Django中按多个对象的属性排序?

如何在Django中按多个对象的属性排序?,django,django-queryset,Django,Django Queryset,我试图通过多个对象的“order”属性过滤对象。这里棘手的部分是,我试图从查询中排除一个特定的单元,但似乎找不到如何做 因此,查询应该做的基本工作是: 获取分配给特定单元的所有问题对象(M2M字段中的单元之一) 按照分配给问题的所有其他单元的“顺序”属性对它们进行排序 范例 ID Question Question.unit 1 question1 unit1, unit2 2 question2 unit1, unit3 3 question3 unit

我试图通过多个对象的“order”属性过滤对象。这里棘手的部分是,我试图从查询中排除一个特定的单元,但似乎找不到如何做

因此,查询应该做的基本工作是:

  • 获取分配给特定单元的所有问题对象(M2M字段中的单元之一)
  • 按照分配给问题的所有其他单元的“顺序”属性对它们进行排序
  • 范例

    ID  Question     Question.unit
    1   question1    unit1, unit2
    2   question2    unit1, unit3
    3   question3    unit1, unit4
    
    代码:

    #views - my code so far, seems to filter by all units
    def get_questions_beside_unit():
        questions = Question.objects.filter(unit=quiz.unit).order_by('unit__order')
    
    #models
    class Question(models.Model):
        ...
        unit = models.ManyToManyField(Unit)
    
    class Unit(models.Model):
        order = models.IntegerField()
    

    您需要使用预取,这样您就可以控制从数据库中获取哪些相关对象

    from django.db.models import Prefetch
    
    pf = Prefetch('unit', Unit.objects.filter(id__in=[1,2,3,4]))
    questions = Question.objects.prefetch_related(pf).order_by('unit__order')
    

    在排序过程中,只有符合预取过滤器的单元,因此您应该得到想要的结果。在我的示例中,它只使用id为[1,2,3,4]的单位。

    有什么原因不能使用
    exclude()
    ?我想我的问题是,我试图按特定的“单位”顺序对它进行排序。在我的例子中,不是“unit1”,而是在每个“问题”中的另一个有趣的问题,我将尝试:)
    from django.db.models import Prefetch
    
    pf = Prefetch('unit', Unit.objects.filter(id__in=[1,2,3,4]))
    questions = Question.objects.prefetch_related(pf).order_by('unit__order')