【问题标题】:Add list values to queryset - Django将列表值添加到查询集 - Django
【发布时间】:2016-01-31 23:40:00
【问题描述】:

我想在查询集的开头添加一个列表对象。

我的 ListAPIView 有以下代码:

def get_queryset(self):
    obj1 = Books.objects.most_read_offset()[:30]
    titles = Category.objects.most_publishes().values('title')
    categories = []
    for title in titles:   
        categories.append(title)
    categories.insert(0, {'title': 'Popular'})
    return chain(categories, obj1)

在我的序列化器中,我使用以下方法获取类别 url:

def get_category_url(self, obj):
    request = self.context['request']
    kwargs = {'slug': obj.category.slug}
    return api_reverse('category_detail_api', kwargs=kwargs,
                       request=request)

当我尝试编译代码时,我收到一条错误消息:'dict' object has no attribute 'category'

有人知道怎么解决吗?

编辑:

这是我希望最终结果的样子:

[
    {
        "titles": "title_1", "title_2", "title_3",
    },
    {
        "id": 62,
        "category_url": "http://127.0.0.1:8000/categories/just-because/",
        "slug": "XG84Jberu6",
    },
    {
        "id": 63,
        "category_url": "http://127.0.0.1:8000/categories/something/",
        "slug": "YU65Zirvq7",
    },
]

【问题讨论】:

  • 看起来你的get_queryset 函数返回了一个迭代器,它返回三种不同的类型——首先是字典,然后是 str 值,然后是 Book 值。你确定这是你想要的吗?
  • @PenguinBrian 我刚刚添加了一个编辑以显示我希望最终结果的样子。但是我们可以做到这一点:)

标签: django django-rest-framework django-queryset


【解决方案1】:

坦率地说,您的 JSON 结果的结构很糟糕,框架工具无法帮助您轻松创建它。回溯并考虑这样的 JSON 结构,而不是在同一个列表中混合不同类型的数据:

{
    "titles": ["title_1", "title_2", "title_3"]
    "books": [
        {
            "id": 62,
            "category_url": "http://127.0.0.1:8000/categories/just-because/",
            "slug": "XG84Jberu6",
        },
        {
            "id": 63,
            "category_url": "http://127.0.0.1:8000/categories/something/",
            "slug": "YU65Zirvq7",
        }
    ]
}

然后从一个简单的 api_view 返回:

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view()
def combined_view(request):
    obj1 = Books.objects.most_read_offset()[:30]
    titles = Category.objects.most_publishes().values_list('title', flat=True)
    books_serializer = BookSerializer(obj1, context={'request': request}, many=True)  # this is your previous serializer
    return Response({
        "titles": titles,
        "books": books_serializer.data,
    })

如果您的most_read_offset() 查询集不包含select_related('category'),您也应该添加它,因为您获取了get_category_url 中所有图书对象的类别。

【讨论】:

  • 谢谢你。我在request = self.context['request'] 行中得到requestKeyError。你知道为什么会这样吗?
  • 更新了传递上下文的答案
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 2012-05-19
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2017-06-17
  • 2020-09-28
相关资源
最近更新 更多