2012-10-25 8 views
6

Sto cercando di serializzare un'istanza di una (su misura) Django Modello utente in questo modo:Django Serializer AttributeError: oggetto 'unicode' non ha l'attributo 'isoformat'

In models.py:

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

nel modello dei dipendenti di cui sopra, in aggiunta agli attributi ereditati dal modello d'uso, io uso i seguenti tipi di campo modello: Charfield(), NullBooleanField(), IntegerField(), DateField(), DecimalField()

Il codice in questione:

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

(ho Django piena serializzatore plug-in di WadOfStuff installato, btw, nel caso in cui quello che conta - ma in questo caso credo che dovrebbe essere inadempiente al serializzatore standard di Django, perché non sto usando qualsiasi del pieno serializzatore del funzionalità in questo caso)

Il __dict__ dipendente (con alcuni campi chiave anonimi) a destra prima di serializzazione viene tentata:

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

traceback parziale:

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' 

Qualche idea su quale potrebbe essere la causa dell'errore o su come posso far funzionare la serializzazione in questo caso? Presumibilmente c'è un qualche tipo di attributo che al Serializzatore non piace - come posso capire quale?

risposta

11

isoformat è un metodo che viene in genere utilizzato su un oggetto datetime.datetime o datetime.date, sembra che stia tentando di farlo su una stringa.

Il mio sospetto è che "hireDate" o "dob", dovrebbe essere un oggetto data/oggetto datetime ma non lo è. Sulla base del traceback puoi provare a impostare quegli attributi come None e vedere se riscontri nuovamente l'errore. In alternativa, dovresti provare a vedere se Django salverà il modello nel database con i dati che hai. In caso contrario, probabilmente ciò che sta causando il problema, nel qual caso i dati vengono inseriti nell'oggetto Impiegato con il tipo sbagliato.

+1

Grazie, questo è esattamente quello che stava succedendo.Sia hireDate che dob dovevano essere oggetti datetime.date, e in realtà erano stringhe. Stranamente, save() stava funzionando bene - sono sorpreso che mi permetta di salvare una stringa sul DB per questi campi. – CQP

+4

Come risolvi questo? – Newtt

0

Durante l'aggiornamento da DRF2.X a DRF3.X questo problema può comparire all'improvviso, come è successo a me. Il motivo è indicato nel DRF 3.0 announcement come arretrata cambiamento incompatibili:

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.

Il modo per risolvere il problema è quello di dire a comportarsi come prima (hanno il serializzatore restituire la rappresentazione dell'oggetto e lasciare che il renderer convertirlo stringa). I 2 modi per farlo sono indicati anche nella pagina degli annunci.

  1. a livello globale per l'applicazione aggiungere questo alla tua settings.py sotto sezioni REST_FRAMEWORK (insieme ad altre preferenze che probabilmente già avete):

    # Return native `Date` and `Time` objects in `serializer.data` 
    'DATETIME_FORMAT': None, 
    'DATE_FORMAT': None, 
    'TIME_FORMAT': None 
    
  2. individualmente per i campi di scelta nel serializzatore DEF:

    creato = serializers.DateTimeField (formato = None)

Problemi correlati