AttributeError:“ collections.OrderedDict”对象没有属性“ model_id”,并且可见字段中缺少“ model_id”

时间:2020-05-13 08:09:58

标签: django-rest-framework

发生了一件奇怪的事情:我正在定义一个端点,并且最初两个字段以API形式可见:model_idpayload,如模型定义中所述:

### 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仍然存在。

这段代码有什么问题?

1 个答案:

答案 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']