【问题标题】:'Package' object has no attribute 'reviews'“包”对象没有属性“评论”
【发布时间】:2021-03-02 13:24:35
【问题描述】:

我正在尝试构建一个列表 api,其中博客文章的 cmets 显示在同一个 api 上,但它会产生以下错误。

尝试在序列化程序 PackageDetailSerializer 上获取字段 reviews 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Package 实例上的任何属性或键都不匹配。 原始异常文本为:“Package”对象没有“reviews”属性。

我的模型:

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',)

我的看法:

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

我的序列化器:

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']

我的网址:

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

【问题讨论】:

    标签: django api serialization django-rest-framework attributes


    【解决方案1】:

    您在Review 模型中设置了related_name='review'

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

    将其更改为related_name='reviews'。然后运行makemigrationsmigrate 命令。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2019-12-10
    • 2020-04-22
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多