【问题标题】:How to nest these Serializes without facing AttributeError: 'BlogPost' object has no attribute 'review_set'如何在不面对 AttributeError 的情况下嵌套这些序列化:“BlogPost”对象没有属性“review_set”
【发布时间】:2021-06-20 06:46:32
【问题描述】:

我跟着Dennis Ivy proshop教程他用了和代码一样的方法

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = '__all__'


class ProductSerializer(serializers.ModelSerializer):
    reviews = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Product
        fields = '__all__'

    def get_reviews(self, obj):
        reviews = obj.review_set.all()
        serializer = ReviewSerializer(reviews, many=True)
        return serializer.data

现在我需要一个用于电子商务项目的博客,我创建了另一个名为 blog 的应用程序并将模型创建为

class BlogPost(models.Model):
    _id = models.AutoField(primary_key=True, editable=False)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    title = models.CharField(max_length=200, null=True, blank=True, help_text="Like How To Treat Hypertension etc")
    image = models.ImageField(null=True, blank=True,
                              default='/placeholder.png')
    rating = models.DecimalField(
        max_digits=7, decimal_places=2, null=True, blank=True)
    numReviews = models.IntegerField(null=True, blank=True, default=0)
    createdAt = models.DateTimeField(auto_now_add=True)
    youtubeVideoLink = models.CharField(max_length=1000, null=True , blank=True)

    def __str__(self):
        return str(self.createdAt)

class BlogPostReview(models.Model):
    blogpost = models.ForeignKey(BlogPost, on_delete=models.SET_NULL, null=True)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    name = models.CharField(max_length=200, null=True, blank=True)
    rating = models.IntegerField(null=True, blank=True, default=0)
    comment = models.TextField(null=True, blank=True)
    createdAt = models.DateTimeField(auto_now_add=True)
    _id = models.AutoField(primary_key=True, editable=False)

    def __str__(self):
        return str(self.rating)

但是当我通过与上述相同的方法对它们进行序列化时......

class BlogPostReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPostReview
        fields = '__all__'

class BlogPostSerializer(serializers.ModelSerializer):
    blog_post_reviews = serializers.SerializerMethodField(read_only=True)  

    class Meta:
        model = BlogPost
        fields = '__all__'

    def get_blog_post_reviews(self, obj):
        blog_post_reviews = obj.review_set.all()
        serializer = BlogPostReviewSerializer(blog_post_reviews, many=True)
        return serializer.data

这个错误来了

in get_blog_post_reviews
    blog_post_reviews = obj.review_set.all()
AttributeError: 'BlogPost' object has no attribute 'review_set'

如何解决此问题或我做错了什么以及需要解决的问题。会有什么另一种方法...。我不知道丹尼斯·艾维为什么在他的代码中使用review_set。如果有人知道我们为什么使用_set 以及是什么情况,请告诉我。

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    最简单的解决方案是更新您的get_blog_post_reviews 方法:

    def get_blog_post_reviews(self, obj):
        blog_post_reviews = obj.blogpostreview_set.all()  # <- this line has changed
        serializer = BlogPostReviewSerializer(blog_post_reviews, many=True)
        return serializer.data
    

    原来的工作是因为有一个名为Review的模型,所以自动创建的反向名称是review_set。你的模型被命名为BlogPostReview,所以反过来是blogpostreview_set

    更多关于reverse relationships in the docs的信息。

    【讨论】:

    • 那些下划线不会出现,应该是blogpostreview_set
    • @AbdulAzizBarkat 哎呀。固定
    • 谢谢! AbdulAzizBarkat 和@MattRowbum。它现在正在工作。
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多