带有 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''')

如果我打印 rawSQL 查询,我会得到:

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]

现在有更好的方法来处理这个问题吗?

feng215 回答:带有 MariaDB 版本控制表的 Django DRF RawSQL

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/623841.html

大家都在问