【问题标题】:Django annotate returned more than oneDjango annotate 返回了多个
【发布时间】:2018-09-22 15:45:43
【问题描述】:
user = get_object_or_404(
    (User.objects
        .annotate(company_name=F('usercompany__company__company_name'))
        .annotate(project=F('team__vacancy__name'))),
    email=request.GET.get('user_email')
)

我遇到了错误:

proj.models.MultipleObjectsReturned: get() returned more than one User -- it returned 2!

如何更改.annotate(project=F('team__vacancy__name'))) 以获取所有信息。

【问题讨论】:

    标签: python django python-3.x django-orm


    【解决方案1】:

    您可以使用prefetch_related 获取职位空缺。根据您的模型,查询集看起来像:

    User.objects.annotate(company_name=F('usercompany__company__company_name')
        ).select_related('team'
        ).prefetch_related('team__vacancy')
    

    然后你可以得到名字:

    names = [v.name for v in user.team.vacancy_set.all()]
    

    【讨论】:

      【解决方案2】:

      当您使用get_object_or_404 时,它需要一个对象。否则返回 HTTP 状态码 404 (NOT FOUND)。

      如果您希望从查询中返回多个对象,那么您应该使用get_list_or_404

      from django.shortcuts import get_list_or_404
      

      正如documentation 中所解释的,get_list_or_404get_object_or_404 之间的差异等同于 .filter().get() 之间的差异。

      【讨论】:

        猜你喜欢
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2020-08-14
        • 2021-06-24
        • 2022-06-21
        • 1970-01-01
        • 2016-08-13
        相关资源
        最近更新 更多