2017-03-02 2 views
1

Ich habe ein Modell, das eine ManyToManyField von Benutzer hat:Bestell Benutzer in einem 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) 

Vorlage (entschuldigung_liste.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 %} 
... 

Wie kann ich den Benutzersatz sortieren (excuse.students.all) alphabetisch nach einem Benutzerfeld, zum Beispiel: user.last_name?

Antwort

1

Sie können dies tun, ändert nur Ihre views.py mit diesem:

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

erinnern User-Modell zu importieren!

+0

Danke! Ich denke, das ist die beste der drei Antworten bisher, weil es im Prefetch enthalten ist, also wird es keinen Haufen zusätzlicher Treffer in der Datenbank geben? Beachten Sie, dass das Benutzerfeld 'last_name' sein sollte – 43Tesseracts

0

Sie können eine Methode in Ihrem Excuse Modell erstellen, das eine sortierte Studenten kehren gesetzt:

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

Und dann in der Vorlage Verwendung excuse.get_sorted_students statt excuse.students.all

Alternativ können Sie verwenden ein benutzerdefiniertes Template-Tag zum Rendern der Schülerliste

Verwandte Themen