2012-10-25 13 views
6

Próbuję serializacji instancji (dostosowany) Django model użytkownika tak:Django serializer AttributeError: 'unicode' obiekt ma atrybut 'isoformat'

W models.py:

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

w modelu wyżej dla pracowników, oprócz cech odziedziczone modelu użytkownika, to stosować następujące rodzaje modelu pola: Charfield() NullBooleanField() IntegerField() DateField() DecimalField()

Kod w pytaniu:

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

(mam zainstalowane Django plugin pełne serializer WadOfStuff za, przy okazji, w przypadku, gdy liczy - ale w tym przypadku uważam, że powinniśmy być zalegających ze standardowym Django serializatora bo nie używam żadnego z pełną serializer użytkownika funkcjonalność w tym przypadku)

__dict__ pracownik (z kilku kluczowych dziedzinach anonimowych) tuż przed serializacji próby:

{'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} 

Częściowa traceback:

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' 

Jakieś pomysły, które mogą być przyczyną błędu lub w jaki sposób mogę przeprowadzić serializację w tym przypadku? Przypuszczalnie jest pewien atrybut, którego Serializator nie lubi - w jaki sposób mogę się dowiedzieć, który?

Odpowiedz

11

isoformat jest metodą, która jest zwykle używana w obiekcie datetime.datetime lub datetime.date, wygląda na to, że próbuje to zrobić na łańcuchu.

Podejrzewam, że albo "hireDate", albo "dob" powinno być obiektem daty/datetime, ale nim nie jest. W oparciu o traceback możesz spróbować ustawić te atrybuty na None i sprawdzić, czy ponownie napotkasz błąd. Alternatywnie, spróbuj sprawdzić, czy Django zapisze model w bazie danych z posiadanymi danymi. Jeśli nie, to prawdopodobnie jest to przyczyną problemu, w którym to przypadku dane są wprowadzane do obiektu Employee z niewłaściwym typem.

+1

Dzięki, właśnie to się stało.Zarówno hireDate, jak i dob miały być obiektami datetime.date i były faktycznie łańcuchami. Co dziwne, funkcja save() działała bez zarzutu - jestem zaskoczona, że ​​mogę zapisać ciąg znaków w bazie danych dla tych pól. – CQP

+4

Jak to naprawić? – Newtt

0

Podczas aktualizacji z DRF2.X do DRF3.X ten problem może się nagle pojawić, tak jak mi się zdarzyło. Powodem jest zawarta w DRF 3.0 announcement jako zacofanego niezgodnych zmian:

Date and Time objects are now coerced to strings by default in the serializer output. Previously they were returned as Date, Time and DateTime objects, and later coerced to strings by the renderer.

drogę do naprawić to, aby powiedzieć, że zachowuje się jak przedtem (mają serializer zwrócić reprezentację obiektów i niech renderujący przekształcić go strunowy). Dwa sposoby na to są również wskazane na stronie ogłoszenia.

  1. globalnie dla aplikacji dodać do swojej settings.py pod sekcjach REST_FRAMEWORK (wraz z innymi preferencjami że prawdopodobnie już posiadasz):

    # Return native `Date` and `Time` objects in `serializer.data` 
    'DATETIME_FORMAT': None, 
    'DATE_FORMAT': None, 
    'TIME_FORMAT': None 
    
  2. indywidualnie dla pól wyboru w serializer def:

    stworzony = serializers.DateTimeField (format = None)

Powiązane problemy