问题描述
我在使用 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 (将#修改为@)