我正在使用Django 1.10,我需要显示数据并创建一个基于另一个模型的值的过滤器(该模型具有引用用于管理模板的模型的外键)。 这是我的两个模型: 这个模型用于生成模板:
class Job(models.Model):
company = models.ForeignKey(Company)
title = models.CharField(max_length=100, blank=False)
description = models.TextField(blank=False, default='')
store = models.CharField(max_length=100, blank=True, default='')
phone_number = models.CharField(max_length=60, null=True, blank=True)
这是另一个引用我第一个对象的外键的对象:
class JobAdDuration(models.Model):
job = models.ForeignKey(Job)
ad_activated = models.DateTimeField(auto_now_add=True)
ad_finished = models.DateTimeField(blank=True, null=True)
在我的模板中,我已经能够显示(最新的)开始和结束时间。
def start_date(self,obj):
if JobAdDuration.objects.filter(job=obj.id).exists():
tempad = JobAdDuration.objects.filter(job=obj).order_by("-id")[0]
return tempad.ad_activated
然后我只需在list_display中调用它,这样就可以正常工作了。但是,我尝试使用这些条件设置筛选字段时遇到了问题。
如果我只是将其添加到list_filter中,那么我会收到一个错误,说我的模型中没有这样的字段,这是正确的(因为那个字段在另一个引用我的job表的表中)。所以我想知道解决这个问题的正确方法是什么?我需要为筛选器本身创建另一个函数吗?但即使如此,我也不确定应该如何在list_filter中调用它。
这是我的Django管理页面的一部分代码片段。
class JobAdmin(admin.OSMGeoAdmin, ImportExportModelAdmin):
inlines = [
]
readonly_fields = ( 'id', "start_date", )
raw_id_fields = ("company",)
list_filter = (('JobAdDuration__ad_activated', DateRangeFilter), 'recruitment', 'active', 'deleted', 'position', ('created', DateRangeFilter), 'town')
search_fields = ('title', 'description', 'company__name', 'id', 'phone_number', 'town')
list_display = ('title', 'id', 'description', 'active', 'transaction_number', 'company', 'get_position', 'town','created', 'expires', 'views', 'recruitment', 'recruits', 'paid', 'deleted', "start_date", "end_Date", "ad_consultant")
def start_date(self,obj):
if JobAdDuration.objects.filter(job=obj.id).exists():
tempad = JobAdDuration.objects.filter(job=obj).order_by("-id")[0]
return tempad.ad_activated
编辑: 同时,我试图使用简单的列表过滤器来解决它,但是我无法使其工作。我想放置2个带有日历的输入字段(类似于默认的DateRangeFilter),表示开始和结束时间,然后根据这些值返回数据。这是我对简单过滤器的“原型”功能,它可以工作,但返回硬编码数据。
class StartTimeFilter(SimpleListFilter):
title = ('Start date')
parameter_name = 'ad_finished'
def lookups(self, request, model_admin):
#return JobAdDuration.objects.values_list("ad_finished")
return (
('startDate', 'stest1'),
('startDate1', 'test2')
)
def queryset(self, request, queryset):
if not self.value():
return queryset
assigned = JobAdDuration.objects.filter(ad_finished__range=(datetime.now() - timedelta(minutes=45000), datetime.now()))
allJobs = Job.objects.filter(pk__in=[current.job.id for current in assigned])
return allJobs
JobAdDuration
和Job
之间建立ManyToOne
关系还是OneToOne
关系? - shad0w_wa1k3r