Django REST框架:AttributeError:Serializer对象没有属性'Meta'

时间:2022-02-09 08:45:38

Given the following model and serializer for a Django REST framework setup:

给出Django REST框架设置的以下模型和序列化器:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.db import models

class StationReport(models.Model):

    water_level = models.IntegerField(max_length=5, blank=False)
    user_name = models.CharField(max_length=256, blank=False)
    email_address = models.CharField(max_length=256, blank=True)
    recorded_at = models.DateTimeField(blank=False)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now_add=True)

...

...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from rest_framework import serializers
from models import StationReport

class StationReportSerializer(serializers.HyperlinkedModelSerializer):
    water_level = serializers.IntegerField(required=True)
    user_name = serializers.CharField(required=True)
    email_address = serializers.CharField(required=False)
    recorded_at = serializers.DateTimeField(required=True)

    def create(self, validated_data):
        return StationReport.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.water_level = validated_data.get('water_level', instance.water_level)
        instance.user_name = validated_data.get('user_name', instance.user_name)
        instance.email_address = validated_data.get('email_address', instance.email_address)
        instance.recorded_at = validated_data.get('recorded_at', instance.recorded_at)
        instance.save()
        return instance

Why am I receiving this AttributeError when I visit http://localhost:8000/stationreports/?

当我访问http:// localhost:8000 / stationreports /时,为什么我会收到此AttributeError?

AttributeError at /stationreports/

'StationReportSerializer' object has no attribute 'Meta'

Request Method:     GET
Request URL:    http://localhost:8000/stationreports/
Django Version:     1.7.3
Exception Type:     AttributeError
Exception Value:    

'StationReportSerializer' object has no attribute 'Meta'

I followed the first part of the Serializers tutorial which does not seem to work in the presented form. I already tried to remove the Meta class in the model but still the error occurs.

我按照Serializers教程的第一部分进行了操作,该教程似乎不适用于所提供的表单。我已经尝试删除模型中的Meta类,但仍然发生错误。

The problem reason

For some reason I did not exactly follow the mentioned Serializers tutorial. My given example works when I change the following:

出于某种原因,我并没有完全遵循上面提到的Serializers教程。当我更改以下内容时,我给出的示例有效:

Before:

class GaugeReportSerializer(serializers.HyperlinkedModelSerializer):
    water_level = serializers.IntegerField(required=True, max_length=5)

After:

class GaugeReportSerializer(serializers.Serializer):
    water_level = serializers.IntegerField(required=True)

I think this mistake happened because I did the Quickstart tutorial before.

我认为这个错误发生是因为我之前做过Quickstart教程。

2 个解决方案

#1


7  

Because you don't have a Meta class defined.

因为您没有定义Meta类。

In Django REST Framework, Meta classes are not inherited from their parent classes.

在Django REST Framework中,Meta类不是从其父类继承的。

class StationReportSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = StationReport

The above should solve your problem.

以上应该可以解决您的问题。

http://www.django-rest-framework.org/api-guide/serializers/#inheritance-of-the-meta-class

http://www.django-rest-framework.org/api-guide/serializers/#inheritance-of-the-meta-class

#2


6  

HyperlinkedModelSerializer is a model serializer. So you need to define the class Meta like below:

HyperlinkedModelSerializer是一个模型序列化器。所以你需要定义类Meta,如下所示:

Moreover, when you set the model on meta class, then you don't need to explicitly define all of the fields on serializer. You just add them to the fields of meta class. Unless your are doing something specialized on the fields.

此外,当您在元类上设置模型时,您不需要显式定义序列化程序上的所有字段。您只需将它们添加到元类的字段中。除非你在这些领域做专门的事情。

class StationReportSerializer(serializers.HyperlinkedModelSerializer):

    # ...

    class Meta:
        model = StationReport
        fields = ( 
            'water_level',
            'user_name',
            'email_address',
            'recorded_at',
        )

    extra_kwargs = {
        'water_level': {'required': True},
        'user_name': {'required': True},
        'email_address': {'required': False},
        'recorded_at': {'required': True},
    } 

#1


7  

Because you don't have a Meta class defined.

因为您没有定义Meta类。

In Django REST Framework, Meta classes are not inherited from their parent classes.

在Django REST Framework中,Meta类不是从其父类继承的。

class StationReportSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = StationReport

The above should solve your problem.

以上应该可以解决您的问题。

http://www.django-rest-framework.org/api-guide/serializers/#inheritance-of-the-meta-class

http://www.django-rest-framework.org/api-guide/serializers/#inheritance-of-the-meta-class

#2


6  

HyperlinkedModelSerializer is a model serializer. So you need to define the class Meta like below:

HyperlinkedModelSerializer是一个模型序列化器。所以你需要定义类Meta,如下所示:

Moreover, when you set the model on meta class, then you don't need to explicitly define all of the fields on serializer. You just add them to the fields of meta class. Unless your are doing something specialized on the fields.

此外,当您在元类上设置模型时,您不需要显式定义序列化程序上的所有字段。您只需将它们添加到元类的字段中。除非你在这些领域做专门的事情。

class StationReportSerializer(serializers.HyperlinkedModelSerializer):

    # ...

    class Meta:
        model = StationReport
        fields = ( 
            'water_level',
            'user_name',
            'email_address',
            'recorded_at',
        )

    extra_kwargs = {
        'water_level': {'required': True},
        'user_name': {'required': True},
        'email_address': {'required': False},
        'recorded_at': {'required': True},
    }