Python 在Django ManyToManyField中订购用户

Python 在Django ManyToManyField中订购用户,python,django,sorting,manytomanyfield,Python,Django,Sorting,Manytomanyfield,我有一个拥有很多用户的模型: 型号.py class Excuse(models.Model): students = models.ManyToManyField(User) reason = models.CharField(max_length=50) def excuse_list(request, block_id=None): queryset = Excuse.objects.all().prefetch_related('students') c

我有一个拥有很多用户的模型:

型号.py

class Excuse(models.Model):
    students = models.ManyToManyField(User)
    reason = models.CharField(max_length=50)
def excuse_list(request, block_id=None):
    queryset = Excuse.objects.all().prefetch_related('students')
    context = {
        "object_list": queryset,
    }
    return render(request, "excuses/excuse_list.html", context)
视图.py

class Excuse(models.Model):
    students = models.ManyToManyField(User)
    reason = models.CharField(max_length=50)
def excuse_list(request, block_id=None):
    queryset = Excuse.objects.all().prefetch_related('students')
    context = {
        "object_list": queryset,
    }
    return render(request, "excuses/excuse_list.html", context)
模板(原谅列表.html)

。。。
{对象_列表%中的借口为%0}
{{借口.理由}
{%为借口中的学生。学生。所有%}
{{学生。获取全名};
{%endfor%}
{%endfor%}
...

如何按用户字段(例如:User.last\u name)的字母顺序对用户集(
preference.students.all
)进行排序?

您只需更改
视图.py即可:

queryset = Excuse.objects.all().prefetch_related(
Prefetch('students', queryset=User.objects.order_by('lastname')))
记住导入用户模型


您可以在借口模型中创建一个方法,该方法将返回排序的学生集:

def get_sorted_students(self):
    return self.students.all().order_by('last_name')
然后在模板中使用
原谅。对学生进行排序,而不是
原谅。学生。所有学生


或者,您可以使用自定义模板标记来呈现学生列表。

谢谢!我认为这是目前为止三个答案中最好的一个,因为它包含在预回迁中,所以不会有一堆额外的数据库点击?请注意,用户字段应为
last\u name