微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 MariaDB 版本控制表的 Django DRF RawSQL

如何解决带有 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]

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。