Django queryset.count().filter()不在自定义模型管理器上工作
我有一个模型管理器,它过滤查询集并返回今天开始的记录对象,即:Django queryset.count().filter()不在自定义模型管理器上工作,django,django-models,django-queryset,Django,Django Models,Django Queryset,我有一个模型管理器,它过滤查询集并返回今天开始的记录对象,即:time\u start.day==datetime.now().day。我无法在模型管理器上使用.count()或筛选器: 我得到了错误 >>>> Records.objects.today().count() TypeError: count() takes exactly one argument (0 given) >>>> Records.objects.today
time\u start.day==datetime.now().day
。我无法在模型管理器上使用.count()或筛选器:
我得到了错误
>>>> Records.objects.today().count()
TypeError: count() takes exactly one argument (0 given)
>>>> Records.objects.today().filter(owner=self.request.user)
AttributeError 'list' object has no attribute 'filter'
我应该返回什么?我不知道怎么才能让它工作。这是经理:
class RecordManager(models.Manager):
use_for_related_fields = True
def today(self, **kwargs):
today = datetime.now(pytz.utc)
yesterday = today - timedelta(days=1)
initial_queryset = self.filter(time_start__gte=yesterday, **kwargs)
return_list = []
for record in initial_queryset:
if (record.time_start).day == today.day:
return_list.append(record)
return return_list
这就是模型:
class Records(models.Model):
owner = models.ForeignKey(User, null=True)
activity = models.ForeignKey(Activity, null=True)
time_start = models.DateTimeField(null=True)
time_end = models.DateTimeField(null=True)
objects = RecordManager()
def is_running(self):
if self.time_end is None:
return True
else:
return False
def total_time(self):
return ((self.time_end-self.time_start).seconds)/60
def string_time_start(self):
if self.time_start:
return self.time_start.strftime("%H:%M %P")
else:
return None
def string_time_end(self):
if self.time_end:
return self.time_end.strftime("%H:%M %P")
else:
return None
def __unicode__(self):
return "%s - %s" % (self.activity.title, self.string_time_start())
非常感谢您的帮助。正确的解决方案是
Records.objects.count()
您从manager方法返回的是一个列表,而不是queryset,所以像count和filter这样的queryset方法自然都不起作用 编辑 我不太清楚你为什么要这么做。似乎您只想查询今天上午12点到晚上11点59分之间的记录,这是一个简单的查询:
today = datetime.date.today()
start = datetime.datetime.combine(today, datetime.time(0))
end = datetime.datetime.combine(today, datetime.time(23, 59))
return self.filter(time_start__gte=start, time_start__lte=end)
正如@Daniel Roseman所写,当我需要返回查询集时,我正在返回一个列表。以防有人读到问题并想看看实际有效的代码:
class RecordManager(models.Manager):
use_for_related_fields = True
def today(self, **kwargs):
today = datetime.datetime.now(pytz.utc)
reference_date = datetime.datetime(today.year, today.month, today.day, tzinfo=pytz.utc)
return self.filter(time_start__gte=reference_date, **kwargs)
请尝试正确工作的Records.objects.count()。我很高兴听到这个:)但是,我如何才能返回查询集呢?如果我需要的是比较
time\u start.day
和datetime.today().day
。我应该为此发布一个不同的问题吗?-1这不是正确的解决方案-因为它没有应用今天属性应该应用的过滤规则。