簡體   English   中英

如何在detailview(Django)中僅在ManytoManyfield上設置order_by?

[英]How to set order_by only on ManytoManyfield in detailview (Django)?

我有 2 個模型ClassStudent Class mdel 中的一個ManytoManyFieldStudent具有ManytoManyField關系。 我想在模板中使用first_name訂購 manytomanyfield。 我該怎么做?

模型.py

class Student(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, primary_key=True)
    first_name = models.CharField(max_length=100)


class Class(models.Model):
    student = models.ManyToManyField(Student)
    subject = models.CharField(max_length=150, unique=True)
    # many other fields

視圖.py

class Class_detailView(LoginRequiredMixin, DetailView):
    login_url = '/'
    model = Class
    template_name = "attendance/content/teacher/class_detail.html

模板

<div class="row ml-auto mr-auto">
  <h6>{{ object.subject }}</h6>
  {% for student in object.student.all %}
    <h6 id="class-detail-text" class="mt-2">
      {{student.first_name}} <-- want to order here
    </h6>
  {% endfor %}
</div>

現在名稱呈現如下:

Freaky  Albon  Bucky

我希望它這樣訂購:

Albon   Bucky  Freaky

在模型元中設置ordering

class Student(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, primary_key=True)
    first_name = models.CharField(max_length=100)

    class Meta: ordering = ('first_name',)

您可以只覆蓋視圖的queryset屬性。 如果您始終希望在訪問它時進行排序,您還可以使用Student模型的Meta屬性。

from django.db.models import Prefetch

class Class_detailView(LoginRequiredMixin, DetailView):
    queryset = Class.objects.prefetch_related(Prefetch('student', queryset=Student.objects.order_by('name'))
    login_url = '/'
    model = Class
    template_name = "attendance/content/teacher/class_detail.html

請參閱有關prefetch_related文檔: https : //docs.djangoproject.com/en/3.1/ref/models/querysets/#prefetch-related

順便說一句,通常ManyToManyField的是多元狀態,因此考慮將其更改為students

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM