DRF中如何让JobSerializer返回单个Review而非列表?
解决方法
方案一:通过SerializerMethodField手动返回单个Review
在JobSerializer里定义review字段,用SerializerMethodField处理单个Review的序列化:
from rest_framework import serializers class JobSerializer(ModelSerializer): review = serializers.SerializerMethodField() def get_review(self, obj): # 取关联集合中的第一个(也是唯一的)Review对象 review_instance = obj.review_set.first() return ReviewSerializer(review_instance).data if review_instance else None class Meta: model = Job fields = [..., 'review', ...] # 替换成你的实际字段列表
这个方法不需要修改模型,直接通过逻辑处理拿到单个Review,不存在时返回null,完全符合语义。
方案二:优化模型关联关系(更简洁)
既然每个Job最多对应一条Review,直接在Review模型的外键上设置related_name,让反向关联直接指向单个对象:
第一步:修改Review模型
class Review(models.Model): job = models.ForeignKey( Job, on_delete=models.CASCADE, unique=True, related_name='review' # 把默认的review_set改成review ) # 其他字段定义...
第二步:修改JobSerializer
class JobSerializer(ModelSerializer): review = ReviewSerializer(read_only=True, default=None) class Meta: model = Job fields = [..., 'review', ...]
设置related_name='review'后,Django会自动为Job实例生成obj.review属性——有对应Review时返回该对象,没有则返回None,刚好匹配ReviewSerializer默认的many=False(单个对象序列化),不会再触发AttributeError。
内容的提问来源于stack exchange,提问作者Jules Olléon
相关产品推荐
相关产品推荐

