1

次のような (簡略化された) 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、それぞれがフィルター処理された場所です。

ビュー.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 %}

上記と同様の方法でオブジェクトを処理できるように、オブジェクトをテンプレートに渡すにはどうすればよいですか?

4

1 に答える 1

0

最初のスニペットは、次の 1 つの呼び出しだけに減らすことができます。

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

テンプレートでこのクエリを実行することはできませんが、そのクエリhotelsセットをテンプレートに渡してレンダリングすることはできます。

于 2013-03-15T11:48:23.753 に答える