6

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

在模型.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 不喜欢的——我怎样才能确定是哪一个?

4

3 回答 3

13

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

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

于 2012-10-25T03:58:33.803 回答
2

当从 DRF2.X 升级到 DRF3.X 时,这个问题可能会突然出现,就像我发生的那样。原因在DRF 3.0 公告中说明为向后不兼容的更改:

默认情况下,日期和时间对象在序列化器输出中被强制转换为字符串。以前它们作为 Date、Time 和 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. 单独用于序列化程序定义中的选择字段:

    created = serializers.DateTimeField(format=None)

于 2016-10-31T06:53:32.967 回答
0

我遇到过类似的问题..

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

直到一天前它都运行良好.. 一切正常的模型-> 字段数都是一样的.. 在我花了这么多时间之后,我发现了确切的错误..

就我而言,mysql表中的字段位置已更改...

例如:

在我的models.py

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

位于第 39 行。当我检查 DB 时,DB 开发人员改变了它在表上的位置。我再次生成模型,解决了我的问题。

下面是我的代码的屏幕截图git status

错误

于 2018-12-06T10:05:11.650 回答