使用 DRF 保存数据时出现 django AttributeError
django AttributeError when saving data with DRF
我在制作 POST 时遇到问题。
条目已创建(我可以在 django 管理面板中看到它)但是 DRF 向我抛出一个错误
AttributeError at /api/v1/reviews/
'Review' object has no attribute 'review_score'
review_score 在前端需要 serializer.py 中的 SerializerMethodField(GET 工作正常)
model.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')
您应该删除行
obj.save()
在 perform_create
函数中。模型保存已经在行
中进行
obj = serializer.save(created_by=self.request.user)
review_score
在 ReviewSerializer 应该是 serializers.ReadOnlyField()
。改变它,它应该工作。
我在制作 POST 时遇到问题。 条目已创建(我可以在 django 管理面板中看到它)但是 DRF 向我抛出一个错误
AttributeError at /api/v1/reviews/
'Review' object has no attribute 'review_score'
review_score 在前端需要 serializer.py 中的 SerializerMethodField(GET 工作正常)
model.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')
您应该删除行
obj.save()
在 perform_create
函数中。模型保存已经在行
obj = serializer.save(created_by=self.request.user)
review_score
在 ReviewSerializer 应该是 serializers.ReadOnlyField()
。改变它,它应该工作。