Mahir Asrani
Mahir Asrani

Reputation: 81

fetch data with condition

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

enter image description here

Output i am getting now (image attached)
enter image description here

Upvotes: 1

Views: 79

Answers (2)

ruddra
ruddra

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

sandeep
sandeep

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

Related Questions