Django REST 框架:属性错误:序列化程序对象没有属性'Meta'



给定以下用于 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

为什么我在访问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'

我遵循了序列化程序教程的第一部分,该教程似乎在呈现的形式中不起作用。我已经尝试删除模型中的Meta类,但仍然发生错误。

问题原因

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

以前:

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

后:

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

我认为发生此错误是因为我之前做过快速入门教程。

因为您没有定义Meta类。

在 Django REST 框架中,Meta类不是从它们的父类继承而来的。

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

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

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

>HyperlinkedModelSerializer是一个模型序列化程序。因此,您需要定义如下所示的class Meta

此外,当您在元类上设置model时,您无需显式定义序列化程序上的所有字段。您只需将它们添加到元类的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},
    } 

最新更新