Django Serializer AttributeError:'unicode'对象没有属性'isoformat'

时间:2012-10-25 03:39:24

标签: django django-serializer

我正在尝试序列化(自定义)Django用户模型的实例,如下所示:

在models.py中:

Class Employee(User):
    company = models.ForeignKey('Company')
    additionalField1
    additionalField2
    etc....

在上面的Employee模型中,除了从User模型继承的属性之外,我还使用以下模型字段类型:CharField(),NullBooleanField(),IntegerField(),DateField(),DecimalField()

有问题的代码:

employee = Employee()
(snip large amounts of code that sets various attributes for employee)
serializers.serialize("json", [employee, ])

(我安装了WadOfStuff的Django完整序列化程序插件,顺便说一句,重要的是 - 但在这种情况下我认为它应该默认为标准的Django序列化程序,因为我没有使用任何完整的序列化程序的功能情况下)

在尝试序列化之前,员工__dict__(有几个关键字段是匿名的):

{'status': u'Act', 'last_name': u'Doe', 'payFrequency': u'Mo', '_state':
 <django.db.models.base.ModelState object at 0x15be890>, 'sex': u'M', 'user_ptr_id': 
None, 'is_staff': False, 'isRegistered': False, 'hireDate': u'2012-08-01', 'id': None, 
'date_joined': datetime.datetime(2012, 10, 25, 2, 39, 22, 793015, tzinfo=<UTC>), 
'city': u'San Francisco', 'first_name': u'John', 'zip': u'94114', u'employmentType': 
u'FT', 'company_id': 4, 'compType': u'S', 'is_superuser': False, 'state': u'CA', 
'last_login': datetime.datetime(2012, 10, 25, 2, 39, 22, 792983, tzinfo=<UTC>), 
'email': '', 'username': 'tu7wwhyskewcpheyoq4lk3i3l', 'address2': '', 'is_active': 
True, 'phone': '', 'address': u'111 Cherry Lane', 'password': 
'pbkdf2_sha256$10000$OAlOtfQClAV2$OC9oCe/9P5hjc4nWd1ZW6cY117PmW1pny8J41axr6mM=', 
'salary': u'10833.00', 'standardHours': None, 'dob': u'1980-04-01', 'socialSecurity': 
u'555555555', 'middleInitial': '', 'payRate': None}

部分追溯:

File "/usr/lib/python2.6/site-packages/django/core/serializers/__init__.py", l                                                                                                                     ine 98, in serialize
s.serialize(queryset, **options)
File "/usr/lib/python2.6/site-packages/wadofstuff/django/serializers/base.py",                                                                                                                      line 52, in serialize
self.handle_field(obj, field)
File "/usr/lib/python2.6/site-packages/wadofstuff/django/serializers/python.py                                                                                                                     ", line 71, in handle_field
self._fields[field.name] = field.value_to_string(obj)
File "/usr/lib/python2.6/site-packages/django/db/models/fields/__init__.py", l                                                                                                                     ine 722, in value_to_string
return '' if val is None else val.isoformat()
AttributeError: 'unicode' object has no attribute 'isoformat'

任何想法可能导致错误或我如何在这种情况下使序列化工作?据推测,Serializer不喜欢某种属性 - 我怎么能找出哪一个?

3 个答案:

答案 0 :(得分:11)

isoformat是一种通常在datetime.datetime或datetime.date对象上使用的方法,看起来它正在尝试对字符串执行此操作。

我怀疑“hireDate”或“dob”应该是一个对象日期/日期时间对象,但不是。根据回溯,您可以尝试将这些属性设置为None,并查看是否再次遇到错误。或者,您应该尝试查看Django是否会使用您拥有的数据将模型保存到数据库中。如果不是这可能是导致您的问题的原因,在这种情况下,数据将被放入具有错误类型的Employee对象中。

答案 1 :(得分:0)

从DRF2.X升级到DRF3.X时,这个问题可能会突然出现,就像发生在我身上一样。原因在DRF 3.0 announcement中声明为向后不兼容的变化:

  

默认情况下,日期和时间对象现在被强制转换为字符串   串行器输出。以前他们被归还为日期,时间和   DateTime对象,稍后由渲染器强制转换为字符串。

修复它的方法是告诉它的行为与之前一样(让序列化程序返回对象表示并让渲染器将其转换为字符串)。这两种方式也在公告页面中显示。

  1. 全局申请 将其添加到REST_FRAMEWORK部分下的settings.py(以及您可能已有的其他首选项):

    # Return native `Date` and `Time` objects in `serializer.data`
    'DATETIME_FORMAT': None,
    'DATE_FORMAT': None,
    'TIME_FORMAT': None
    
  2. 单独列出序列化器def中的选择字段:

    created = serializers.DateTimeField(format = None)

答案 2 :(得分:0)

我也遇到过类似的问题。

AttributeError: 'unicode' object has no attribute 'isoformat'

直到一天前它都工作正常。.一切正常的模型->字段数都相同。 经过这么长时间,我发现了确切的错误。

在我的情况下, 字段位置在mysql表中已更改...

例如:

在我的 models.py

file_path = models.CharField(max_length=255, null=True, blank=True)

位于第39行..当我检查数据库时,数据库开发人员更改了其在表上的位置..我再次生成了解决问题的模型。.

下面是我的代码git status

的屏幕截图

error