用于计算最近一天创建的对象的查询集

Queryset for counting the object created for last one day

假设我有两个模型

class Testmodel1():
   amount = models.IntegerField(null=True)
   contact = models.CharField()
   entry_time = models.DateTimeField()

class Testmodel2():
   name = models.CharField()
   mobile_no = models.ForeignKey(Testmodel1)

我正在为此模型创建对象(Testmodel2)。现在我想通过 mobile_no 字段找出过去 24 小时内创建的对象 (Testmodel2) 的计数。

最好的查询方式是什么。

如有任何帮助,我们将不胜感激。

最好将联系人字段设为 models.DateTime 字段而不是 models.CharField。如果它是 DateTime 字段,您可以轻松地对其执行 lte、gte 和其他操作,以将其与其他日期时间进行比较。

例如,如果 Testmodel.contact 是 DateTime 字段,则您问题的答案将是:

Testmodel.objects.filter(contact__gte=past).count()

如果联系人字段包含表示日期时间的字符串,我建议将其切换,因为确实没有理由将其存储为字符串。

如果您无法更改这些字段,很遗憾,我认为没有办法在数据库级别执行此操作。您必须在 python 端单独过滤它们:

from dateutil.parser import parse

results = []
past = arrow.utcnow().shift(hours=-24)
model_query = TestModel.objects.all()
for obj in model_query.iterator():
  contact_date = parse(obj.contact)  # Parse string into datetime
  if contact_date > past:
    results.append(obj)
print(len(results))

这将为您提供一个包含所有匹配模型实例的列表(注意:不是查询集)。它会比其他选项慢很多,之后你不能用 results.filter(amount__gte=1).count() 之类的东西编辑结果,而且它不太干净。

也就是说,它会完成工作。

编辑 我突然想到这个 可能 可以通过注释来完成,但我不确定这将如何完成,或者它是否会起作用。如果他们能想出一种使用注释的方法以更好的方式完成此操作,我会推迟其他答案,但坚持我最初的评估,即这可能应该是 DateTime 字段。

编辑 2 现在在另一个模型上添加了 DateTime 字段,您可以像这样跨模型查找它:

past = arrow.utcnow().shift(hours=-24)
Testmodel2.objects.filter(mobile_no__entry_time__gte=past)