How to nest these Serializes without facing AttributeError: 'BlogPost' object has no attribute 'review_set'

How to nest these Serializes without facing AttributeError: 'BlogPost' object has no attribute 'review_set'

我遵循了 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'

如何解决这个问题或我做错了什么以及需要修复的地方。会有什么是另一个 apporach obv ......而且我不知道为什么 Dennis Ivy 在他的代码中使用 review_set 。如果有人知道我们为什么使用 _set 以及在什么情况下请告诉我。

最简单的解决方案是更新您的 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 的更多信息。