如何获取带有值作为列表的单独查询集?

时间:2019-01-30 17:09:29

标签: python django django-rest-framework

我正在使用其余框架重构Django应用程序。我试图返回带有评论的帖子,然后应用程序对此进行处理。

这是我的json设计,我无法更改模型。但是我可以更改json设计。

{
    "id": 1
    "title": "Title",
    "content": "Content",
    ...,
    "comments": [
        [
            {
                "id": 1,
                "parent": 0,
                "content": "Content",
                ...
            },
            {
                "id": 2,
                "parent": 1,
                "content": "Content",
                ...
            },
        ],
        [
            {
                "id": 3,
                "parent": 0,
                "content": "Content",
                ...
            },
            {
                "id": 4,
                "parent": 3,
                "content": "Content",
                ...
            },
        ],
    ],
    ...
}

在注释中,有许多列表按“组”列分组。在这种情况下,数据看起来像这样。

Comment(id=1, parent=0, content="Content", group=1)
Comment(id=2, parent=1, content="Content", group=1)
Comment(id=3, parent=0, content="Content", group=2)
Comment(id=4, parent=3, content="Content", group=2)

我想获取由group列分隔的查询集。我想这样使用。

comments = Comment.objects.filter() # How can I get?
# [[Comment(id=1), Comment(id=2)], [Comment(id=3), Comment(id=4)]]
serializer = CommentSerializer(comments, many=True)

我向here提到了如何将序列化器与列表一起使用。

1 个答案:

答案 0 :(得分:1)

我不知道该如何在数据库查询中完成。但是我非常希望以下代码可以解决您的问题。

comments = Comment.objects.order_by('-group') 
# now we have <Comment(id=1), Comment(id=2), Comment(id=3), Comment(id=4)> as query_set

现在,我们将按组号分隔列表,然后将其合并。就像

response = []
current_group = [] # this will add in repose separated by group number
previous_group = -1 # assign anything that can't be a group number

for comment in comments: 
    serializer = CommentSerializer(comment)
    if serializer.data['group'] == previous_group:
       current_group.append(serializer.data)
    else:
        if previous_group != -1: # our previous assign value
           response.append(current_group)
           current_group = []
           current_group.append(serializer.data)
           previous_group = serializer.data['group']
        else:   # first value
           current_group.append(serializer.data)
           previous_group = serializer.data['group']

# check current_group list length
if len(current_group) > 0:
   response.append(current_group)

现在我们的响应数组就像

[[Comment(id=1), Comment(id=2)], [Comment(id=3), Comment(id=4)]]

然后返回响应数组。