假设我有两个型号
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)
创建对象。现在我想找出(Testmodel2)
字段在过去24小时内创建的对象mobile_no
的数量。
什么是最好的查询方式。
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果您将联系人字段设置为models.DateTime
字段而不是models.CharFiel
d,那就更好了。如果它是一个DateTime字段,你可以轻松地对它进行lte,gte和其他操作,以便将它与其他日期时间进行比较。
例如,如果Testmodel.contact是DateTime字段,那么您问题的答案将是:
Testmodel.objects.filter(contact__gte=past).count()
如果联系人字段包含表示DateTime的字符串,我建议将其切换,因为没有理由将其存储为字符串。
如果您无法更改这些字段,遗憾的是我认为在数据库级别上无法做到这一点。您必须在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)