发生了一件奇怪的事情:我正在定义一个端点,并且最初两个字段以API形式可见:model_id
和payload
,如模型定义中所述:
### models.py:
class CarModel(models.Model):
model_id = models.CharField(max_length=10, primary_key=True)
name = models.CharField(max_length=40)
active = models.BooleanField(default=True)
def __str__(self):
return self.model_id
class Calculator(models.Model):
model = models.ForeignKey(CarModel, on_delete=models.CASCADE)
payload = models.TextField()
def model_id(self):
return self.model.model_id
def __str__(self):
return f"Calculations for {self.model.name}"
### serializers.py:
class CalculatorSerializer(serializers.ModelSerializer):
model_id = serializers.SerializerMethodField()
class Meta:
model = Calculator
fields = ['model_id', 'payload']
def get_model_id(self, obj):
return obj.model_id()
### views.py:
class CalculatorViewSet(viewsets.ModelViewSet):
serializer_class = CalculatorSerializer
queryset = Calculator.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return Response(f"{serializer.data.upper()}", status=status.HTTP_200_OK)
因此,两个字段都是可见的,但是POST请求以AttributeError: 'collections.OrderedDict' object has no attribute 'model_id'
结尾。为了解决这个问题,我最终无意中从视图中删除了model_id
-它没有以DRF的形式显示。并且AttributeError
仍然存在。
这段代码有什么问题?
答案 0 :(得分:0)
好的,事实证明,以这种方式定义fields
:
fields = '__all__'
也使model_id
可见。仍然不知道为什么显式插入不起作用。
在另一个问题AttributeError
的情况下,我不得不从OrderedDict中提取值。修改后的方法如下:
def get_model_id(self, obj):
return obj["model"].model_id
除此之外,我在views.py
的{{1}}方法中发现了另一个错误:create
无法实现serializer.data
方法;某些键(在我的情况下为upper()
)必须被引用,例如:
serializer.data['payload']