【问题标题】:Django queryset .count() .filter() not working on custom model managerDjango queryset .count() .filter() 不适用于自定义模型管理器
【发布时间】:2015-01-27 12:43:46
【问题描述】:

我有一个模型管理器,用于过滤查询集并返回今天开始的 Records 对象,即:time_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()
  • 工作正常。
  • 我很高兴听到这个消息 :)

标签: django django-models django-queryset


【解决方案1】:

你从你的 manager 方法返回一个列表,而不是一个查询集,所以像 count 和 filter 这样的查询集方法自然不会工作。

编辑

我不太清楚你为什么要这么做。好像只想查询今天12.00am到11.59pm之间的记录,很简单的查询:

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)

【讨论】:

  • 但是,我怎样才能返回一个查询集呢?如果我需要将time_start.daydatetime.today().day 进行比较。我应该为此发布一个不同的问题吗?
【解决方案2】:

正如@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)

【讨论】:

    【解决方案3】:

    正确的解决方案是

    Records.objects.count()
    

    【讨论】:

    • -1 这不是正确的解决方案 - 因为它没有应用 today 属性应该应用的过滤规则。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多