【问题标题】:Complex filtering in DjangoDjango中的复杂过滤
【发布时间】:2013-03-15 11:37:24
【问题描述】:

我有一个(简化的)Django 模型,类似于以下内容:

models.py

# python
class Hotel(models.Model):
     name = models.Charfield()

class RoomType(models.Model):
     hotel=models.ForeignKey(Hotel, related_name="roomtypes")
     price=models.IntegerField() # really  a currency field

class Room(models.Model):
     hotel = models.ForeignKey(Hotel)
     roomType = models.ForeignKey(RoomType, related_name="rooms")

class Reservation(models.Model):
     room = models.ForeignKey(Room)
     date = models.DateField()

所以我的模板需要的层次结构是Hotel->RoomType->Room,其中每个都已被过滤。

views.py

# only get available rooms that meet the user supplied criteria in q
q = Q() # complex query building omitted
rooms = Room.objects.filter(q) 

# only get roomtypes that have rooms meeting criteria in q
roomTypesValues = rooms.values_list('roomType', flat=True)
roomTypes = RoomType.objects.filter(pk__in=list(roomTypesValues))

# only get hotels that have rooms meeting criteria in q
hotelsValues = roomTypes.values_list('hotel', flat=True)
hotels = Hotel.objects.filter(pk__in=list(hotelsValues))

c=RequestContext(request, {'hotels': hotels})

在某种程度上,这些查询中的每一个都有效。我还没有弄清楚如何在模板中使用它们。

我正在尝试让这样的东西正常工作(HTML 简化):

template.html

{% for hotel in hotels %}
<h1>{{hotel.name}}</h1>

   <ul>
   {% for roomtype in hotel.roomtypes %}
     <li>
       {{roomtype.name]}, {{roomtype.price}}
       {% for room in roomtype.rooms %}
            <!-- not really needed for this -->
       {% endfor %}
     </li>
   {% endfor %}
   </ul>
{% endfor %}

如何将对象传递给模板,以便以与上述类似的方式处理它们?

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案1】:

    您的第一个 sn-p 可以简化为仅此一次调用:

    hotels = Hotel.objects.filter(roomtype__room=<whatever your criteria are>)
    

    您不能在模板中执行此查询,但您可以将 hotels 查询集传递给模板以在那里呈现。

    【讨论】:

    • 这会为每个房间生成一个酒店(在酒店中)。如果一家酒店有 4 间符合标准的房间,我会得到 4 份该酒店的副本。而且我似乎找不到要迭代哪个对象来访问每个酒店中过滤的 RoomType。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2022-11-30
    • 2011-02-06
    • 2018-01-16
    • 2011-04-21
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多