【问题标题】:Django : 'collections.OrderedDict' object is not callableDjango:'collections.OrderedDict'对象不可调用
【发布时间】:2021-06-24 11:59:34
【问题描述】:

我正在尝试向使用序列化程序 UserSerializer 继承 AbstractUser 的模块 User 发出发布请求,但我收到错误“collections.OrderedDict”对象在字段“PhoneNumber”中不可调用。 序列化器:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model= User
        fields="__all__"
    def save(self, **kwargs):
        user = User(
            username = self.validated_data.get('username'),
            first_name =self.validated_data.get('first_name'),
            last_name = self.validated_data.get('last_name'),
             email=self.validated_data.get('email'),
            Address=self.validated_data.get('Address'),
            PhoneNumber=self.validated_data('PhoneNumber'))
        user.save()

用户模型:

class User(AbstractUser):
    Address=models.TextField(blank=True,null=True)
    PhoneNumber = models.CharField(max_length=15, blank=True,verbose_name='PhoneNumber')
    cdNumber = models.CharField(max_length=16, blank=True,verbose_name='cdNumber')
    cdDate=models.DateField(blank=True,null=True,verbose_name='cdDate')
    cdName = models.CharField(max_length=16, blank=True,verbose_name='cdName')
    def __str__(self):
        return self.first_name+" "+self.last_name

【问题讨论】:

  • 我猜self.validated_data('PhoneNumber') 应该是self.validated_data.get('PhoneNumber'),因为这就是你处理所有其他值的方式。你错过了get 电话。

标签: python django django-models django-rest-framework


【解决方案1】:

这个

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model= User
        fields="__all__"
    def save(self, **kwargs):
        user = User(
            username = self.validated_data.get('username'),
            first_name =self.validated_data.get('first_name'),
            last_name = self.validated_data.get('last_name'),
            email=self.validated_data.get('email'),
            Address=self.validated_data.get('Address'),
@@@
-           PhoneNumber=self.validated_data('PhoneNumber'))
===
+           PhoneNumber=self.validated_data.get('PhoneNumber'))
@@@
        user.save()

PS:我强烈建议使用 pythonic snake_cased 字段名称而不是 PascalCased 字段名称,后者通常用于类型。

或者至少尝试对每个类使用单一的命名约定。因为这并不是真正的赞赏:

            last_name = self.validated_data.get('last_name'),
            PhoneNumber=self.validated_data.get('Address'),

您可以在PEP8找到更多代码风格推荐

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2011-06-07
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2018-03-30
    相关资源
    最近更新 更多