2017-07-12 10 views
1

クエリーセットのdjangoテンプレートにM2Mフィールドの属性の1つを表示しようとしています。私はrooms fielsにアクセスしようとしていますdjangoアクセスm2mクエリーセットのフィールド属性

Reservationクエリセットから今
class Reservation(models.Model): 
    hotel = models.ForeignField(Hotel) 
    rooms = models.ManyToManyField(Room, through='ReservationRoom') 

class Room(models.Model): 
    number = models.IntegerField(default=0) 

class ReservationRoom(models.Model): 
    reservation = models.ForeignKey(Reservation, related_name='reservation_rooms', on_delete=models.PROTECT) 
    room = models.ForeignKey(Room, on_delete=models.PROTECT) 
    room_type = models.ForeignKey(RoomType, related_name='reservation_rooms', on_delete=models.PROTECT) 

は、

{% for res in reservations %} 
    <tr> 
     <td>{{ loop.index }}</td> 
     {% for room in reservations.rooms_set.all%} 
      <td>{{ room.number }}</td> 
     {% endfor %} 
    </tr> 
{% endfor %} 

views

def arrivals(request, hotel): 
    res = Reservation.objects.filter(hotel=hotel) 
    return render(request, "sample.html", {'reservations': res}) 

、このようすなわちnumber(神社のテンプレートを使用して)Djangoのテンプレートで属性しかし、次のエラーを投げると、

'django.db.models.query.QuerySet object' has no attribute 'rooms_set' 

どうしたのですか? neverwalkaloner

Traceback Switch to copy-and-paste view 

/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django/core/handlers/exception.py in inner 
     response = get_response(request) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django/core/handlers/base.py in _legacy_get_response 
     response = self._get_response(request) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django/core/handlers/base.py in _get_response 
      response = self.process_exception_by_middleware(e, 
request) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django/core/handlers/base.py in _get_response 
      response = wrapped_callback(request, *callback_args, 
**callback_kwargs) ... 
▶ Local vars 
/home/rayhan/work/XercesBlue/core/rbac/decorators.py in _wrapped_view 
        return view_func(request, hotel, *args, **kwargs) 
... 
▶ Local vars 
/home/rayhan/work/XercesBlue/pms/guest/views.py in arrivals 
return render(request, "pms/guest/arrivals.html", {'reservations': 
res, 'arrivals': True}) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django/shortcuts.py in render 
content = loader.render_to_string(template_name, context, request, 
using=using) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django/template/loader.py in render_to_string 
return template.render(context, request) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/django_jinja/backend.py in render 
    return mark_safe(self.template.render(context)) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/jinja2/environment.py in render 
    return self.environment.handle_exception(exc_info, True) ... 
▶ Local vars 
/home/rayhan/work/venv/local/lib/python2.7/site- 
packages/jinja2/environment.py in handle_exception 
    reraise(exc_type, exc_value, tb) ... 
▶ Local vars 
/home/rayhan/work/XercesBlue/templates/pms/guest/arrivals.html in top- 
level template code 
{% do sidebar_items.user.update({'children': True}) %} ... 
▶ Local vars 
/home/rayhan/work/XercesBlue/templates/pms/base.html in top-level 
template code 
    {% block content %} ... 
▶ Local vars 
/home/rayhan/work/XercesBlue/templates/pms/guest/arrivals.html in 
block "content" 
            {% for room in res.rooms.all %} 
... 
▶ Local vars 


TypeError at /exe/hotel/260/guest/arrivals/ 
'instancemethod' object is not iterable 
Request Method: GET 
Request URL: http://localhost:8000/exe/hotel/260/guest/arrivals/ 
Django Version: 1.11 
Exception Type: TypeError 
Exception Value:  
'instancemethod' object is not iterable 
+0

'through'テーブルを使用しているため、' rooms_set'はありません。 'through'を使用しないとうまくいくでしょう。 –

+1

あなたはReservationRoomというモデルがありますか? – Exprator

+0

@Expratorはい私は.. – RTan

答えて

1

見つかり溶液をしようとした答えの後

トレースバックは、テンプレート内prefetch_related

res = Reservation.objects.filter(hotel=hotel).prefetch_related('rooms') 

、その後に

{% for room in res.rooms.all() %} 
    <td>{{ room.number }}</td> 
{% endfor %} 

roomsを追加し、今すぐ希望の結果、すなわち部屋番号が表示されます。

関連する問題