在Django应用中,我有以下两个模型:Event
和EventDate
。我想在Event的管理列表视图中显示一些来自EventDate的计算数据,我希望能够对其进行排序。
我根据EventDate中的数据计算每个事件的下一个即将到来的日期。现在,我希望它不仅显示在Event的Django Admin列表视图中,而且还希望按其排序事件。
Django模型如下所示:
class EventDate(models.Model):
date = models.DateField(db_index=True)
start = models.TimeField(blank=True, null=True)
end = models.TimeField(blank=True, null=True)
event = models.ForeignKey('Event')
class Event(TimeStampedModel):
title = models.CharField(max_length=200)
text = models.TextField()
published = models.BooleanField(default=False, db_index=True)
首先,我为Event模型提供了一个返回下一个日期的属性,该属性可以正常工作:我可以在中显示下一个日期list_display
,甚至可以使用优化prefetch_related
。但是我无法在列表显示中的该字段上进行排序:(
接下来,我尝试使用添加到模型中extra
,以解决此限制。
class EventAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(EventAdmin, self).get_queryset(request)
qs.extra(
select={
'n2': """SELECT MIN(events_eventdate.date) FROM events_eventdate
WHERE events_event.id == events_eventdate.event_id AND
events_eventdate.date >= '{}'
""".format(now().date().isoformat())
}
)
return qs
它可以在调试外壳程序中工作,但是我无法在管理员中使用它。我不知道如何将其包括在内list_display
或做其他事情。
似乎我找到了一种使用额外通话中的数据的方法...
我在中添加了一个方法,EventAdmin
并admin_order_field
为该方法设置了额外调用所生成的字段:
class EventAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(EventAdmin, self).get_queryset(request)
qs = qs.prefetch_related('eventdate_set')
qs = qs.extra(
select={
'next_date': """SELECT MIN(events_eventdate.date)
FROM events_eventdate
WHERE events_event.id == events_eventdate.event_id AND
events_eventdate.date >= '{}'
""".format(now().date().isoformat())
}
)
return qs
def next_date(self, obj):
try:
return obj.next_date
except IndexError:
return 'abgelaufen'
next_date.short_description = 'Nächster Termin'
next_date.admin_order_field = 'next_date'
不知道这是干净还是理智...似乎可以正常工作,我会继续这样做,因为在这里很难找到Django Questions的答案。会报告是否对我不利。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句