ashes999
ashes999

Reputation: 1324

TypeError: 'Review' object is not iterable Django Object not iteratble

I am trying to get all object from a many to many field in my course model and filter them based on the course code. Basically, I am trying to return all the reviews for courses with same course code. But I get the error:

TypeError: 'Review' object is not iterable

and it returns nothing.

When I print it out I get: <QuerySet [<Course_course_reviews: Course_course_reviews object (1)>]> which is a query set but I do not know why it is not returning anything in my course model I have the method:

def get_reviews(self):
        return Course.course_reviews.through.objects.filter(course__course_code=self.course_code,course__course_university=self.course_university,course__course_instructor=self.course_instructor)

and the many to many link with review model is:

course_reviews = models.ManyToManyField(Review, blank=True, related_name='course_reviews')

Why isnt it returning anything in my template? I am confused on what the issue is here.

I also like to add that when I print the reviews sent form my view to my template I get: <QuerySet [<Course_course_reviews: Course_course_reviews object (1)>]>

Models:

class Review(models.Model):
    author = models.ForeignKey(Profile, on_delete=models.CASCADE)
    body = models.TextField(validators=[MaxLengthValidator(400)])
    created_on = models.DateTimeField(auto_now_add=True)
    likes= models.ManyToManyField(Profile, blank=True, related_name='review_likes')

class Course(models.Model):
    course_code = models.CharField(max_length=20)
    course_university = models.CharField(max_length=100)
    course_instructor = models.CharField(max_length=100)
    course_reviews = models.ManyToManyField(Review, blank=True, related_name='course_reviews')

Upvotes: 0

Views: 487

Answers (1)

JPG
JPG

Reputation: 88619

Add a method in your model as,

class Course(models.Model):
    course_code = models.CharField(max_length=20)
    course_university = models.CharField(max_length=100)
    course_instructor = models.CharField(max_length=100)
    course_reviews = models.ManyToManyField(Review, blank=True, related_name='course_reviews')

    def get_reviews(self):
        return Review.objects.filter(course_reviews__course_code=self.course_code).distinct()

Usage

course_instance = Course.objects.get(id=12345)
reviews = course_instance.get_reviews()

Upvotes: 1

Related Questions