【问题标题】:How to pick only one row from rows with common date in datetimefield?如何从日期时间字段中具有共同日期的行中仅选择一行?
【发布时间】:2018-02-10 09:50:07
【问题描述】:

我正在编写一个 django 应用程序,在该应用程序中,我只需要从中选择一行,然后从包含日期时间字段列中相同日期的多行中排除其余行。

我的模型是:

class Model(models.Model):
    user_id = models.IntegerField()
    datetime = models.DateTimeField()

我只想从每个日期中选择一个用户。这是我选择所有行的方法:

data = Model.objects.all()

如何从日期时间字段的每个日期中只选择一个用户?

【问题讨论】:

  • Model.objects.all().distinct('user_id')
  • 是的,但我必须从忽略时间的日期时间字段中获取不同的日期。想知道这是怎么回事?
  • 另外我正在使用不同的 sqlite 不起作用。知道如何在 sqlite 中做到这一点吗?
  • 过滤日期间隔(下限 = 00:00:00 的时间;上限 = 23:59:59 的时间)Model.objects.all().filter(datetime__gte = startTimeAtDay).filter(datetime__lte = endTimeAtDay)

标签: mysql django django-queryset


【解决方案1】:

如果你想在每个日期时间选择一个用户,你可以使用这个

data = Model.objects.all().distinct('datetime')

如果你想在每个日期选择一个用户,你可以使用这个

data = Model.objects.all().extra({'date': 'date(datetime)'}).distinct('date')

date - 是一个 SQL 函数,可能取决于您使用的 sql server

如果你使用 django 1.10+,你可以使用TruncDate

data = Model.objects.all().annotate(date=TruncDay('datetime').distinct('date')

没有distinct,你可以使用这个hack:

data = Model.objects.all().extra({'date': 'date(datetime)'}).values("data").annotate(Max("user_id"))

【讨论】:

    【解决方案2】:

    你可以试试这个,

    data = Model.objects.all()
    
    date_list = list(set([element.datetime.date() for element in data])) 
    
    for date in date_list:  
    obj = Model.objects.filter(datetime__date=date).first()
    if isinstance(obj, Model): 
        user_list.append(obj.user_id)
    
    return user_list
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2019-06-20
      相关资源
      最近更新 更多