first 和 last 方法使用了排除项

Posted

技术标签:

【中文标题】first 和 last 方法使用了排除项【英文标题】:first and last methods used excluded items 【发布时间】:2022-01-23 02:17:16 【问题描述】:

我使用last()在排除以下一些项目后获取查询集的最后一项:

holidays = HolidayModel.objects.all().values_list('date', flat=True)
result = BorseExchangeLog.objects.exclude(
hint_time__date__in=holidays
)
# output 1
print(list(result.valuse_list('hint_time__date',flat=True).distinct('hint_time__date')))
#output2
print(result.last().hint_time.date())

但在output2 中打印output1 中不存在的项目

我测试了一些其他代码如下:

print(list(logs.values_list('hint_time__date',flat=True).distinct('hint_time__date')))
print(list(logs.values_list('hint_time__date', flat=True).distinct('hint_time__date'))[-1])
print(logs.order_by('hint_time__date').last().hint_time.date())


[..., datetime.date(2020, 10, 21), datetime.date(2020, 10, 26)]
2020-10-26
2020-10-25

我的假期模式:

class HolidayModel(models.Model):
    creator = models.ForeignKey('accounts.Account', on_delete=models.PROTECT, verbose_name=_('Creator'))
    reason = models.CharField(default='', max_length=200, verbose_name=_('Reason'))
    date = models.DateField(default=timezone.now, verbose_name=_('Date'))

其他型号是:

class BorseExchangeLog(models.Model):
    create_time = models.DateTimeField(default=timezone.now)
    hint_time = models.DateTimeField(default=timezone.now)

我通过first() 测试过,问题也存在

什么问题?我的代码是错误的还是来自 django orm 的错误?

使用 django2.2 和 postgresql

【问题讨论】:

您能否将获得的输出和模型添加到您的问题中? 好的帖子已编辑。添加一些示例和我测试过的其他内容 【参考方案1】:

您的日期时间可以识别时区,但 datetime 对象上的 date() 方法不考虑时区,__date 将考虑时区 provided your DB supports it。使用django.utils.timezone.localdate 函数获取考虑时区的日期

from django.utils.timezone import localdate
print(localdate(result.last().hint_time))

【讨论】:

以上是关于first 和 last 方法使用了排除项的主要内容,如果未能解决你的问题,请参考以下文章

channel first和channel last之间的转换方法

[ jquery 过滤器 .first() | .last() ] 此方法用于在选择器的基础之上精确筛选出第一个(最后一个)元素(可以使用前导限制范围)

Enumerable.Last 方法

error: L6236E: No section matches selector - no section to be FIRST/LAST.解决方法

jQuery 遍历 – 过滤

DOM遍历 - 过滤