gpt4 book ai didi

django - 手动组合多个 Django QuerySet,并使用 DRF 序列化结果

转载 作者:行者123 更新时间:2023-12-02 11:38:08 29 4
gpt4 key购买 nike

我已经研究了几天了。不幸的是,到目前为止我发现的所有建议的解决方案并不完全适合我。

我希望手动将两个 Django 查询集合并到一个 Django 模型中,然后我想使用 Django Rest Framework 序列化器对其进行序列化。然后我使用序列化器输出 JSON。

我在SO上找到了各种解决方案,建议使用itertools和chain,但目前还不清楚如何序列化chain的结果。

请注意,我的目标是为了 Web 应用程序性能。每个 QuerySet 都可以独立工作,但需要两个单独的 Ajax 调用来检索结果。我更愿意只进行一次 Ajax 调用,在服务器端手动合并结果,然后返回合并后的 JSON。

这个SO答案很接近,但我不知道如何使用 DRF 序列化器序列化链的结果。

最佳答案

经过几天的谷歌搜索这个问题的答案,我终于偶然发现了 this page这解释了如何做我想做的事情。我已经在这里发布了我自己的答案,以防其他人遇到同样的问题。

现在我已经理解了该技术,看起来很简单,但我很难在网上找到任何描述该技术的内容。基本上,您将多个查询集链接在一起,然后将链转换为 Python 列表。然后迭代列表,手动调用正确的序列化器,并附加到字典中。然后你可以将字典转储为 JSON。

我已经发布了相关代码,以防链接失效:

    def get_queryset(self):
queryset_a = Post.objects.all()
queryset_b = FriendRequest.objects.filter(is_unanswered=True)

# Create an iterator for the querysets and turn it into a list.
results_list = list(chain(queryset_a, queryset_b))

# Optionally filter based on date, score, etc.
sorted_list = sorted(results_list, key=lambda instance: -instance.date_created)

# Build the list with items based on the FeedItemSerializer fields
results = list()
for entry in sorted_list:
item_type = entry.__class__.__name__.lower()
if isinstance(entry, Post):
serializer = PostSerializer(entry)
if isinstance(entry, FriendRequest):
serializer = FriendRequestSerializer(entry)

results.append({'item_type': item_type, 'data': serializer.data})

return results

关于django - 手动组合多个 Django QuerySet,并使用 DRF 序列化结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39537543/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com