2017-03-02 65 views
1

我有了用户的ManyToManyField模型:在订购用户Django的ManyToManyField

models.py

class Excuse(models.Model): 
    students = models.ManyToManyField(User) 
    reason = models.CharField(max_length=50) 

views.py

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) 

模板(excuse_list.html)

... 
{% for excuse in object_list %} 
    <tr> 
     <td>{{ excuse.reason }}</td> 
     <td> 
     {% for student in excuse.students.all %} 
      {{student.get_full_name}}; 
     {% endfor %} 
     </td> 
    </tr> 
{% endfor %} 
... 

如何按用户字段按字母顺序对用户集(excuse.students.all)进行排序,例如:user.last_name?

回答

1

,你可以这样做只是改变你的views.py与此:

queryset = Excuse.objects.all().prefetch_related(
Prefetch('students', queryset=User.objects.order_by('lastname'))) 

记得导入用户模型!

+0

谢谢!我认为这是迄今为止最好的三个答案,因为它包含在预取中,所以在数据库上不会有一堆额外的点击数?请注意,用户字段应该是'last_name' – 43Tesseracts

0

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

def get_sorted_students(self): 
    return self.students.all().order_by('last_name') 

,然后在模板中使用的excuse.get_sorted_students代替excuse.students.all

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