从另一个模型向序列化器添加额外字段

4
我将在我的项目中将Model添加到另一个序列化程序中。以下是规范。我有一个名为Review的模型,如下所示。
class Review(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    rating= models.ForeignKey(ProductRating, on_delete=models.DO_NOTHING)
    comment = models.TextField()

我的功能是显示用户为产品编写的评论数量,我应该在序列化程序中像这样显示。
class WishList(models.Model):
    user = models.ForeignKey('authentication.User', on_delete=models.CASCADE, null=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)

serailzier.py

class GetWishlistSerializer(serializers.ModelSerializer):

name = serializers.CharField(source='product.name', read_only=True)
rating = serializers.IntegerField(source='product.rating', read_only=True)
image = serializers.ImageField(source='product.image', read_only=True)
price = serializers.DecimalField(source='product.price', decimal_places=2, max_digits=10, read_only=True)
review = SerializerMethodField()

class Meta:
    model = WishList
    fields = ['user','product', 'name', 'rating', 'image', 'price', 'description', 'review']

def get_review(self, obj):
    return Review.objects.filter(product_id=obj.id).count()

它应该计算指定产品的评论数量,但它没有工作,结果就像这样。

{
            "user": 1,
            "product": 1,
            "name": "Samsung A70",
            "rating": 5,
            "image": "http://localhost:8000/media/products/2019/08/30/wkl6pb_E2RUzH6.jpeg",
            "price": "2500.00",
            "description": "bla bla bla",
            "review": 0
        }

但我对产品:1有一个评论,它应该显示为1,但它显示为0。我不知道我错了什么。请问有什么帮助吗?如果问题不清楚,请让我知道,我会尽力详细说明。

2个回答

1
问题出在查询语句上。应该使用

,而不是
# comparing it with wishlist pk instead of wishlist's pro
Review.objects.filter(product_id=obj.id).count()

但它应该获取产品评论。
def get_review(self, obj):
    return Review.objects.filter(product_id=obj.product.id).count()

0

我会使用.annotate

from django.db.models import Count

WishList.objects.annotate(review_count=Count('product__review_set')

检查一下产品评论相关的名称,但如果您没有定义它,它应该是review_set
然后在WishListSerializer字段中添加'review_count'review_count = serializers.IntegerField(required=False) 您需要在ViewSet中的查询集上进行注释。我会重写get_queryset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接