Django查询集中从datetime字典提取日期的问题求助
解决Django QuerySet中提取日期年/月/日的问题
首先得明确:你用values('send_date')得到的是Django QuerySet对象,它本质是一个可迭代的字典集合——哪怕只匹配到一条数据,它也是类似列表的结构,不是单个字典或datetime对象,这就是你之前所有尝试失败的核心原因。
错误原因拆解
queryset.strftime(...):strftime()是datetime.date/datetime.datetime对象的方法,QuerySet根本没有这个属性;queryset['send_date']:QuerySet是集合类型,不能像字典那样直接用键索引,得先取出里面的字典元素;queryset.get('send_date'):QuerySet的get()方法是用来获取符合条件的模型实例,不是字典的取值方法;queryset.items():items()是字典的方法,QuerySet没有这个属性,你得遍历QuerySet里的每个字典才能用items()。
正确解决方案
方法1:从values()返回的QuerySet中提取
因为你是按id查询,结果应该只有一条,所以可以用first()取出QuerySet里的唯一字典,再提取日期对象:
queryset = MyModel.objects.filter(id=id).values('send_date') # 获取第一个(也是唯一的)字典 date_item = queryset.first() if date_item: # 避免查询结果为空的情况 send_date = date_item['send_date'] # 直接提取年、月、日属性 year = send_date.year month = send_date.month day = send_date.day print(year, month, day) # 输出:2020 9 30
方法2:直接获取模型实例(更直观)
如果你的需求只是提取单个实例的send_date字段,其实没必要用values(),直接用get()获取模型实例再取属性更简单:
try: my_model = MyModel.objects.get(id=id) send_date = my_model.send_date year = send_date.year month = send_date.month day = send_date.day except MyModel.DoesNotExist: # 处理id不存在的情况 print("该记录不存在")
两种方法都能轻松拿到你需要的2020、9、30,推荐第二种,代码更简洁且可读性更高。
内容的提问来源于stack exchange,提问作者quba
相关产品推荐
相关产品推荐

