2017-03-02 2 views
1

私は、ユーザーのの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 %} 
... 

ユーザーフィールド(たとえば、user.last_name)によって、ユーザーセット(excuse.students.all)をアルファベット順に並べ替える方法を教えてください。

答えて

1

あなただけのこれであなたのviews.pyを変更するこれを行うことができます:

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

Userモデルをインポートすることを忘れないでください!ソートされた学生戻ります

+0

ありがとうございます!私はこれがプリフェッチの中に含まれているのでこれまでの3つの答えの中で最高だと思うので、データベースに追加のヒットが山積することはありませんか? Userフィールドは 'last_name'でなければならないことに注意してください。 – 43Tesseracts

0

あなたの言い訳モデル内のメソッドを作成することができますが、設定:

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

そしてexcuse.get_sorted_students代わりに別の方法としてexcuse.students.all

のテンプレートを使用して、あなたが使用することができます学生のリストをレンダリングするためのカスタムテンプレートタグ。