Django annotate 返回了多个
Posted
技术标签:
【中文标题】Django annotate 返回了多个【英文标题】:Django annotate returned more than one 【发布时间】: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')))
以获取所有信息。
【问题讨论】:
【参考方案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_404
和 get_object_or_404
之间的差异等同于 .filter()
和 .get()
之间的差异。
【讨论】:
以上是关于Django annotate 返回了多个的主要内容,如果未能解决你的问题,请参考以下文章
get() 返回了多个模块——它返回了 2 个! (REST API - Django)