代码之家  ›  专栏  ›  技术社区  ›  Milano

Django:基于相关集注释值

  •  1
  • Milano  · 技术社区  · 7 年前

    我正在寻找一种方法来注释聚合过滤相关集的值。

    class Location(...
        ...
    
    class Ticket(...
        location = ForeignKey(Location...)
        date = ...
        price = ...
    

    我需要在日期范围内标注机票的最高价格。

    因此,如果我只设定最后30天,它将返回我所有的时间 Location 对象和每个对象都有“max_price”注释,该注释等于过去30天的门票最高价格。

    门票:

    <Ticket France 100 now-50days>
    <Ticket France 200 now-20days->
    <Ticket France 300 now-20days>
    <Ticket Austria 200 now-10days>
    <Ticket Austria 50 now-10days>
    

    在本例中,queryset返回:

    <Location France> + annotated 200
    <Location Austria> + annotated 50
    

    能一次完成吗 Query ?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Saad Aleem    7 年前

    这应该可以做到:

    from django.db.models import Case, Max, Q
    date = datetime.datetime.today() - datetime.timedelta(days=30)
    
    events = Locations.objects.annotate(
        max_price=Max('ticket_set__price', filter=Q(ticket_set__date__gte=date))
    )
    

    请注意,我正在使用 ticket_set 因为我不知道你有没有 related_name 在外键上与否。如果你有一个相关的名字,比如 tickets ,用它代替 套票 .