【问题标题】:TypeError in Django REST framework Tutorial 1: SerializationDjango REST framework 中的TypeError 教程一:序列化
【发布时间】:2014-12-01 16:10:57
【问题描述】:

我想知道有人可以帮助我并为我澄清这个错误。

我正在学习 Django REST 框架教程,并且在创建序列化程序类时开始学习。

from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES

class SnippetSerializer(serializers.ModelSerializer):
    pk = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False,
                                  max_length=100)
    code = serializers.CharField(style={'type': 'textarea'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES,
                                       default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES,
                                    default='friendly')

class Meta:
    model = Snippet
    fields = ('id', 'title', 'code', 'linenos', 'language', 'style')


def create(self, validated_attrs):
    """
    Create and return a new 'Snippet' instance, given the validated data.
    """
    return Snippet.objects.create(**validated_attrs)

def update(self, instance, validated_attrs):
    """
    Update and return an existing 'Snippet' instance, given the validated data.
    """
    instance.title = validated_attrs.get('title', instance.title)
    instance.code = validated_attrs.get('code', instance.code)
    instance.linenos = validated_attrs.get('linenos', instance.linenos)
    instance.language = validated_attrs.get('language', instance.language)
    instance.style = validated_attrs.get('style', instance.style)
    instance.save()
    return instance

现在我的问题是,当我进入 shell 进行序列化以及我想导入时 from snippets.serializers import SnippetSerializer模块抛出这个错误:

>>> from snippets.serializers import SnippetSerializer

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/petarp/Documents/Django_Rest_Framework/serialization_tutorial/tutorial/snippets/serializers.py", line 6, in <module>
    class SnippetSerializer(serializers.ModelSerializer):
  File "/home/petarp/Documents/Django_Rest_Framework/serialization_tutorial/tutorial/snippets/serializers.py", line 10, in SnippetSerializer
    code = serializers.CharField(style={'type': 'textarea'})
  File "/home/petarp/.virtualenvs/env/local/lib/python2.7/site-packages/rest_framework/fields.py", line 468, in __init__
    super(CharField, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'style'

有人可以澄清这个错误并帮助我克服这个问题。

【问题讨论】:

  • 请也发布您的代码段模型

标签: python django serialization django-rest-framework


【解决方案1】:

使用widget属性定义表单字段类型:

code = serializers.CharField(widget=forms.Textarea())

您可能正在使用 DRF v2.x.x,它不支持 Field 类中的 style 参数

【讨论】:

  • 您的问题是您使用了 ModelSerializer(在本教程中,他们使用基本的序列化程序。Serializer)。所以字段不是以相同的方式构建的,并且模型序列化器不需要“style”关键字:serializer.CharField 只支持“widget”,正如 mariodev 所说。
  • 感谢您的注意,当我使用您的代码时,@mariodev 我领导了另一个 Traceback,说我的表单没有定义,所以我使用了 'code = serializers.CharField(widget=widgets.Textarea() ',下次我会更仔细地阅读。
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 2017-06-04
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2016-11-21
相关资源
最近更新 更多