Daniel Ben-Shabtay
Daniel Ben-Shabtay

Reputation: 350

get latest object from databse regardless of user in django

I am learning python and django and I am coding a project similar to IMDB.
I am using python 3.8.2 64 bit and django 3
I want to display the latest review a movie received regardless of the user that wrote it.
Now it shows the user's own latest review and after logging the user out the review remains without displaying the user that wrote it. I have tried to clear cache and history, didn't help. this is the model:

from django.db import models
from django.contrib.auth.models import User

class Movie(models.Model):
    movie_title = models.CharField(max_length=250)
    movie_poster = models.ImageField(default='default.png', blank=True)
    movie_short_description = models.TextField()
    director = models.CharField(max_length=250)
    actor1 = models.CharField(max_length=250)
    actor2 = models.CharField(max_length=250)
    actor3 = models.CharField(max_length=250)
    actor4 = models.CharField(max_length=250)
    year = models.IntegerField()

    def __str__(self):
        return self.movie_title + ' - ' + str(self.year)

class Review(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    user = models.ForeignKey(User, default = None, on_delete=models.DO_NOTHING)
    score = models.IntegerField()
    review_title = models.CharField(max_length=250, default="")
    movie_review = models.TextField()
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        get_latest_by = 'date'

    def __str__(self):
        return self.review_title

views.py

def movie_detail(request, pk):
    try:
        movie  = Movie.objects.get(pk=pk)
        review = Review.objects.all().latest()
    except Exception as e:
        print(e)
    return render (request, 'movies/movie_detail.html', {'movie': movie, 'review': review})

html code:

                </table>
            </p>
            <p>User Reviews</p>
            <h3>Score: {{review.score}}  {{review.review_title}}</h3>
            <h6>{{review.date}}, by {{ user.get_username }}</h6>
            <p>{{review.movie_review}}</p>
            <a href="{% url 'add_review' pk=movie.pk %}">Review this title</a>
        </div>
    </div>
{% endblock %}

Upvotes: 0

Views: 59

Answers (1)

Myzel394
Myzel394

Reputation: 1317

I would create a property on Movie that gives you all reviews and then get the latest Review from this queryset. Here' the code:

# models.py
class Movie(models.Model):
    # your other code

    @property
    def reviews(self) -> QuerySet:
        return self.review_set.all()


# views.py
def movie_detail(request, pk):
    movie = get_object_or_404(Movie, pk=pk)
    latest_review = movie.reviews.latest()
    # return

Ps: I would rename movie_title, movie_poster and movie_short_description to just title, poster and short_description. It is obvious that the title on Movie is the movies' title. I would also strongly suggest to change the 4 actors to a single model with a ManyToMany-relation (but I think you will read on that in the documentation later).

Upvotes: 1

Related Questions