【问题标题】:django AttributeError when saving data with DRF使用 DRF 保存数据时出现 django AttributeError
【发布时间】:2021-12-29 16:33:08
【问题描述】:

我在发布 POST 时遇到问题。 条目已创建(我可以在 django 管理面板中看到它)但 DRF 向我抛出错误

/api/v1/reviews/处的AttributeError

'Review' 对象没有属性'review_score'

review_score 在 serializer.py 中作为前端所需的 SerializerMethodField(GET 运行良好)

模型.py

class Review(models.Model):
    company = models.ForeignKey(Company, related_name='company_review', on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    comments = models.TextField()
    validated = models.BooleanField(default=False)
    note_quality = models.DecimalField(max_digits=5, decimal_places=2)
    note_timing = models.DecimalField(max_digits=5, decimal_places=2)
    note_qualprix = models.DecimalField(max_digits=5, decimal_places=2)
    note_react = models.DecimalField(max_digits=5, decimal_places=2)
    note_followup = models.DecimalField(max_digits=5, decimal_places=2)
    note_clean = models.DecimalField(max_digits=5, decimal_places=2)

    created_at = models.DateField(auto_now_add=True)
    created_by = models.ForeignKey(User, related_name='created_review', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

views.py

class ReviewViewSet(viewsets.ModelViewSet):
    serializer_class = ReviewSerializer
    queryset = Review.objects.all()

    def get_queryset(self):
        company_id = self.request.query_params.get('company_id', None)

        return self.queryset.filter(company_id=company_id, validated=True).annotate(
            review_score = Sum(F('note_quality')+F('note_timing')+F('note_qualprix')+F('note_react')+F('note_followup')+F('note_clean'))/6,
        )

    def perform_create(self, serializer):
        obj = serializer.save(created_by=self.request.user)

serializer.py

class ReviewSerializer(serializers.ModelSerializer):
    created_by = UserCreateSerializer(read_only=True)
    review_score = serializers.SerializerMethodField()

    def get_review_score(self, obj):
        rounded = round_up(obj.review_score, 0.5)        
        return rounded

    class Meta:
        model = Review
        read_only_fields = ('created_at'),
        fields = ('id','company','title','comments','validated','note_quality','note_timing','note_qualprix','note_react','note_followup','note_clean','created_at', 'created_by', 'review_score')

【问题讨论】:

  • 我在您的 Review 模型中没有看到任何名为 review_score 的字段,但您在这里使用的是 round_up(obj.review_score, 0.5)
  • review_score 根据注释查询集在views.py 中给出。从那里,我通过添加自定义字段在我的 serializer.py 中获取注释。输出在 DRF 中使用 GET 方法完美运行。 POST出现问题

标签: python django django-rest-framework django-serializer


【解决方案1】:

ReviewSerializer 中的review_score 应该是serializers.ReadOnlyField()。改变它,它应该可以工作。

【讨论】:

  • 我就知道是这样的!我在 SerializerMethodField 上用“read_only=True”尝试了很多东西……这解决了我的问题,谢谢! :)
  • 很高兴为您提供帮助:)
【解决方案2】:

你应该删除行

obj.save()

perform_create 函数中。模型保存已经在生产线中进行了

obj = serializer.save(created_by=self.request.user)

【讨论】:

  • 这是正确的,我已经更新了我的初始帖子和我的代码。错误是一样的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多