6

(カスタマイズされた) 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'

この場合、エラーの原因やシリアライゼーションを機能させる方法はありますか? おそらく、シリアライザーが気に入らないある種の属性があると思われます-どの属性をどのように特定できますか?

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 オブジェクトは、シリアライザーの出力でデフォルトで強制的に文字列に変換されるようになりました。以前は、Date、Time、および DateTime オブジェクトとして返されていましたが、後でレンダラーによって強制的に文字列に変換されました。

これを修正する方法は、以前と同じように動作するように指示することです (シリアライザーにオブジェクト表現を返させ、レンダラーにそれを文字列に変換させます)。そのための 2 つの方法は、お知らせページにも記載されています。

  1. アプリケーションに対してグローバルに、これを REST_FRAMEWORK セクションの下の settings.py に追加します (おそらく既に持っている他の設定と共に):

    # Return native `Date` and `Time` objects in `serializer.data`
    'DATETIME_FORMAT': None,
    'DATE_FORMAT': None,
    'TIME_FORMAT': None
    
  2. シリアライザーの定義で選択したフィールドに対して個別に:

    作成された = serializers.DateTimeField(format=None)

于 2016-10-31T06:53:32.967 に答える