Django ORM:Min('field',filter = ...)导致TypeError:只能将列表(而非“ tuple”)连接到列表

时间:2018-12-28 13:05:10

标签: python sql django postgresql django-orm

有一个模型Location,可以有多个Ticket对象(使用ForeignKey)。

Ticket模型的price字段是DecimalField

现在我有Ticket个对象的QuerySet,我想获取Location个对象的QuerySet并注释min_price的值,该值是所有Ticket对象的最低价格FILTERED QuerySet。

例如:

tickets = Ticket.objects.filter(something)

locations = Location.objects.all().annotate(min_price=<minimal price from tickets having this location>)

我尝试过的事情:

locations_annotated = Location.objects.all().annotate(
            min_price=Min('tickets__min_price', filter=tickets))

这不起作用。当我尝试从locations_annotated获取第一个元素时,调试器将返回:

TypeError: can only concatenate list (not "tuple") to list 

你知道该怎么办吗?

2 个答案:

答案 0 :(得分:0)

我认为注释使用不正确。请尝试

locations_annotated = Location.objects.annotate(
        min_price=Min('tickets__min_price', filter=tickets)

答案 1 :(得分:0)

基本上,您应该将django.db.models.query_utls.Q对象作为filter参数传递,而不是将经过过滤的查询集传递到Min中:

locations_annotated = Location.objects.all().annotate(
            min_price=Min('ticket__price', filter=Q(something)))

请注意,something内的所有过滤器均应加ticket__前缀