按组排序Django查询集的最好方法是什么?



我有以下事件模型:

class EventStatus(models.TextChoices):
Open = "Open"
Closed = "Closed"
Completed = "Completed"
Archived = "Archived"
class Marketplace(models.Model):
Creator = models.ForeignKey(User, on_delete=models.CASCADE)
Speaking_Event_Name = models.CharField(max_length=100)
Location = models.CharField(max_length=500, null=True)
Topic = models.CharField(max_length=40)
date = models.DateTimeField(default=timezone.now)
Status = models.CharField(max_length=9, choices=EventStatus.choices, default=EventStatus.Open)
def __str__(self):
return self.Speaking_Event_Name
def status(self):
return EventStatus.Completed if timezone.now() > self.date else self.Status

和我还有下面的视图函数来显示用户的事件列表:

def view_events(request):
event_list = Marketplace.objects.filter(Creator=current_user)
content = {'events': event_list}
return render(request, 'view_events.html', content)

我想知道如何按状态排序事件列表,其中所有的"打开"首先列出事件,然后是"已关闭"事件。第二,"Completed"第三和"存档";去年上市。

您可以根据选择使用优先级进行注释:

from django.db.models import Case, Value, When

def view_events(request):
event_list = (
Marketplace.objects.filter(Creator=current_user)
.alias(
priority=Case(
*[When(Status=status, then=Value(i)) for i, status in EventStatus]
)
)
.order_by('priority')
)
return render(request, 'view_events.html', {'events': event_list})

注意: Django模型中的字段名通常写成snake_case,而不是PascalCase,所以应该是:creator而不是Creator

相关内容

最新更新