Python Django';是ORM。按有差异的元素分组
我有这个Django模型:Python Django';是ORM。按有差异的元素分组,python,django,orm,Python,Django,Orm,我有这个Django模型: class Visits(models.Model): ip = models.GenericIPAddressField() url = models.CharField(max_length=200) datetime = models.DateTimeField(auto_now_add=True) def __unicode__(self): return "%s : %s (%s)" % (unicode(self.ip)
class Visits(models.Model):
ip = models.GenericIPAddressField()
url = models.CharField(max_length=200)
datetime = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return "%s : %s (%s)" % (unicode(self.ip),
unicode(self.datetime.strftime('%d/%m/%y %H:%M:%S')),
unicode(self.url))
它包含对我的网站的所有访问。例如,这些都是DB中的值:
<Visits: 127.0.0.1 : 27/11/14 00:00:00 (/)>,
<Visits: 127.0.0.1 : 27/11/14 00:01:00 (/)>,
<Visits: 127.0.0.1 : 27/11/14 00:09:00 (/)>,
<Visits: 127.0.0.1 : 27/11/14 00:45:00 (/)>,
<Visits: 127.0.0.1 : 27/11/14 00:46:00 (/)>
,
,
,
,
我想写一个ORM查询,用15分钟的增量对值进行分组。例如,此查询应返回count()==2
(前三个值在第一组中,后两个值在第二组中)。我如何使用Django的ORM实现它?
在这里,我有四次拜访,我试着用28号以上的迷你餐车过滤掉
>>> visits_count = len([ obj for obj in Visits.objects.all() if obj.datetime.strftime('%M') > '28'])
>>> visits_count
2
它适用于大于等于28的情况
>>> visits_count = len([ obj for obj in Visits.objects.all() if obj.datetime.strftime('%M') >= '28'])
>>> visits_count
4
这不是一件容易的事,您应该首先制定出正确的SQL来实现它,然后反向工作到Django ORM。您可能必须使用
extra
方法,也许可以使用自定义聚合类,否则,只需raw
method按15分钟增量查看这个类似的问题,你的意思是datetime对象等于或大于15分钟,对吗?我想你首先需要用一个类似时间戳的值来注释queryset,该值表示每个特定的15分钟窗口,然后在其他字段上聚合,但按注释字段分组。这可能有助于@michaeluskov,如果您想要基于不同ip的结果,那么在唯一ip 127.0.0.1的情况下,为什么您希望count()==2持续15分钟或更长时间?第一个答案应该是3(第一个、第二个和最后两个),如果您希望它通过ip不同,您可以使用查询“for obj in visions.objects.distinct('ip')”如果您想要基于不同ip的结果,那么在ip 127.0.0.1唯一的情况下,为什么您希望count()==2持续15分钟或更长时间?@Downvoter请给出您的Downvoter的原因?