Reputation: 81
I am doing a movie booking project in which i want to time of particular cinema
def movies(request, id):
cin = Cinema.objects.filter(shows__movie=id).distinct()
movies = Movie.objects.get(movie=id)
show = Shows.objects.filter(movie=id)
context = {
'movies':movies,
'show':show,
'cin':cin,
}
return render(request, "movies.html", context )
movies.html HTML file can i do something to get time of cinema
<div class="card">
<img class="card-img-top" src="{{movies.movie_poster.url}}" alt="Card image cap">
<div class="card-body">
<h4 class="card-title">{{movies.movie_name}}</h4>
<p class="card-text">{{movies.movie_rating}}</p>
</div>
<ul class="list-group list-group-flush">
{% for cin in cin %}
<li class="list-group-item"><b>Cinema {{cin}}</b></li>
{% for show in show %}
<li class="list-group-item"> Time : {{show.time}}</li>
{% endfor %}
{% endfor %}
</ul>
</div>
models.py file so you can get detail of my database structure ( i just want to fetch movie with its show but based on cinema separate )
class Cinema(models.Model):
cinema=models.AutoField(primary_key=True)
role=models.CharField(max_length=30,default='cinema_manager')
cinema_name=models.CharField(max_length=50)
phoneno=models.CharField(max_length=15)
city=models.CharField(max_length=100)
address=models.CharField(max_length=100)
user = models.OneToOneField(User,on_delete=models.CASCADE)
def __str__(self):
return self.cinema_name
class Movie(models.Model):
movie=models.AutoField(primary_key=True)
movie_name=models.CharField(max_length=50)
movie_des=models.TextField()
movie_rating=models.DecimalField(max_digits=3, decimal_places=1)
movie_poster=models.ImageField(upload_to='movies/poster', default="movies/poster/not.jpg")
def __str__(self):
return self.movie_name
class Shows(models.Model):
shows=models.AutoField(primary_key=True)
cinema=models.ForeignKey('Cinema',on_delete=models.CASCADE)
movie=models.ForeignKey('Movie',on_delete=models.CASCADE)
time=models.CharField(max_length=100)
seat=models.CharField(max_length=100)
price=models.IntegerField()
def __str__(self):
return self.cinema.cinema_name +" | "+ self.movie.movie_name +" | "+ self.time
Output i am getting now (image attached)
Upvotes: 1
Views: 79
Reputation: 51978
Probably you can do it like this:
<ul class="list-group list-group-flush">
{% for show in movies.shows_set.all %}
<li class="list-group-item"><b>Cinema {{show.cinema}}</b></li>
<li class="list-group-item"> Time : {{show.time}}</li>
{% endfor %}
</ul>
Here I am using reverse relation(or related objects)
from Movie
to Shows
using movie.shows_set.all
and show
object has everything you need(like cinema and show time).
Upvotes: 0
Reputation: 711
Add related name in Show model:
models.py
cinema=models.ForeignKey('Cinema',on_delete=models.CASCADE, related_name='cinema_show')
movie=models.ForeignKey('Movie',on_delete=models.CASCADE, related_name='movie_show')
Views.py
movies = Movie.objects.get(movie=id) # get movie
cin = Cinema.objects.filter(cinema_show__movie=movies).prefetch_related('cinema_show') # get all cinema
template:
{% for i in cin %}
<p>(i.cinema_name)</p> # cinema name
{% for j in i.cinema_show.all %}
<p> (j.time)</p> # all show
{% endfor %}
{% endfor %}
Upvotes: 1