-1

I am trying to build a list api where comments of the blog post are shown on same api but it generates following error.

Got AttributeError when attempting to get a value for field reviews on serializer PackageDetailSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Package instance. Original exception text was: 'Package' object has no attribute 'reviews'.

My models:

class Package(models.Model):
    destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
    package_name = models.CharField(max_length=255)
    featured = models.BooleanField(default=False)
    price = models.IntegerField()
    duration = models.IntegerField(default=5)
    discount = models.CharField(max_length=255, default="15% OFF")
    discounted_price = models.IntegerField(default=230)
    savings = models.IntegerField(default=230)
    special_discount = models.BooleanField(default=False)
    rating = models.IntegerField(choices=((1, 1),
                                          (2, 2),
                                          (3, 3),
                                          (4, 4),
                                          (5, 5))
                                 )
    image = models.ImageField(blank=True)
    thumbnail = ImageSpecField(source='image',
                                      processors=[ResizeToFill(100, 50)],
                                      format='JPEG',
                                      options={'quality': 60})
    content =RichTextField()
    highlights = RichTextField()
    itinerary = RichTextField()
    image_1= models.ImageField(blank=True,null = True)
    image_2= models.ImageField(blank=True,null = True)
    image_3= models.ImageField(blank=True,null = True)
    date_created = models.DateField()


    def __str__(self):
        return self.package_name

    # def is_featured(self):
    #     return self.featured

class Review(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='review')
    full_name = models.CharField(max_length=255)
    review = RichTextField()
    created_at = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return self.full_name

    class Meta:
        ordering = ('created_at',)

My view:

class AllPackageDetailAPIView(RetrieveAPIView):
    queryset = Package.objects.all()
    serializer_class = PackageDetailSerializer

My serializers:

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = ['id', 'package', 'full_name', 'review']



class PackageDetailSerializer(serializers.ModelSerializer):
    destination = serializers.StringRelatedField()
    reviews = ReviewSerializer(many=True)

    class Meta:
        model = Package
        fields = ['id', 'destination', 'package_name', 'image', 'duration', 'featured', 'content', 'highlights',
                  'image_1', 'image_2', 'image_3', 'itinerary',  'date_created', 'reviews']

My urls:

path('api/allpackages/<int:pk>', views.AllPackageDetailAPIView.as_view(), name='api-package-detail'),

1 Answers1

0

You have set related_name='review' in Review model:

class Review(models.Model):
    ...
    package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='review')              
                                                                                 ^^^^^^

Change it to related_name='reviews'. Then run makemigrations and migrate commands.

ruddra
  • 50,746
  • 7
  • 78
  • 101