如何解决带有 MariaDB 版本控制表的 Django DRF RawSQL
我在使用 Django rest 框架和 MariaDB 版本表时遇到了一个奇怪的问题:
在我的数据库中,我有一个名为 foods_food
的表,它是一个 MariaDB 版本控制表。我想获取截至特定时间点的表中所有数据的列表:
foods = Food.objects.raw(
'''SELECT * FROM foods_food
for SYstem_TIME as of '2021-04-01 09:46:41.911590+00:00''')
print(foods)
# OUTPUT:
<RawQuerySet: SELECT * FROM foods_food for SYstem_TIME as of '2021-04-01 09:46:41.911590+00:00'>
我已将 sql 查询复制粘贴到我的 DBMS 中,我可以确认它按预期工作。
现在,要将实际数据返回到我的 API 端点,我必须将 rawQuerySet
转换为 query set
中的 views.py
:
queryset = Food.objects.filter(pk__in=[i.pk for i in raw_queryset])
但是,当我返回 queryset
数据时,版本控制被完全忽略,并且返回的数据为“最新版本”。我错过了什么?
更新:
所以在我的 views.py
中,我使用 generics.ListCreateAPIView
并在 get_queryset
方法中获取我的原始 sql 数据。
我注意到原始 sql 数据在我传递时包含正确的数据,并且只有当我将其转换为 queryset
时才会返回不正确的数据。
所以我尝试不将原始 sql 转换为 QuerySet,如下所示:
foods = Food.objects.raw(
'''SELECT * FROM foods_food
for SYstem_TIME as of '2021-04-01 09:46:41.911590+00:00''')
return [obj for obj in foods]
AttributeError: 'list' object has no attribute 'model'
所以我去检查了 generics.ListCreateAPIView
源代码及其父代码,其中调用了 get_queryset
,特别是返回的 QuerySet
的用途。
在这里我发现 get_queryset
像这样被 filter_queryset
调用:http://www.cdrf.co/3.1/rest_framework.generics/ListCreateAPIView.html#filter_queryset
特别是,QuerySet
是针对 class 属性“评估”的:filter_backends
,在我的情况下是:
filter_backends = [DjangoFilterBackend,filters.SearchFilter]
最后我提出了这个解决方案,虽然我完全删除了 filter_backends
并且它似乎有效:
foods = Food.objects.raw(
'''SELECT * FROM foods_food
for SYstem_TIME as of '2021-04-01 09:46:41.911590+00:00''')
self.filter_backends = []
return [obj for obj in foods]
现在有更好的方法来处理这个问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。