2016-01-06 25 views
5

Sulla base del DRF documentation ho un creato un elenco di EMAIL_ID memorizzati nel mio modello nel modo seguente Models.pyDjango Riposo quadro: modo corretto di serializzare ListFields

class UserData(models.Model): 
    emails = models.CharField(max_length=100,blank=False) 

Nel mio file serializers.py

class UserSerializer(serializers.ModelSerializer): 
    emails = serializers.ListField(child = serializers.EmailField()) 

Durante la pubblicazione dei dati, la pagina Drf mostra i dati nel formato previsto, ovvero

"emails": [ 
     "[email protected]" 
    ], 

Ma, se interrogo gli stessi dati utilizzando python o qualsiasi resto del client. Ottengo i dati nel seguente formato

data = json.load(urllib2.urlopen("http://localhost:8000/blah/id")) 
In [46]: d['emails'] 
Out[46]: 
[u'[', 
u'u', 
u"'", 
u'b', 
u'a', 
u'l', 
u'@', 
u'b', 
u'a', 
u'l', 
u'.', 
u'c', 
u'o', 
u'm', 
u"'", 
u']'] 

Idealmente, avrebbe dovuto essere

d['emails'] = ['[email protected]'] 

Non sono sicuro, che cosa esattamente è sbagliato qui. Eventuali suggerimenti ?

risposta

1

Il modello ha solo un campo di posta elettronica. Non supporta la memorizzazione di più e-mail nel database. Quello che vi serve è qualcosa di simile:

class UserEmail(models.Model) 
    user = models.ForeignKey('User', related_name='emails') 
    email = models.EmailField(unique=True) 

    # You can also store some other useful things here... 
    activated = models.BooleanField(default=False) # For example 


class User(models.Model): 
    ... 


class EmailSerializer(serializers.ModelSerializer): 
    class Meta: 
     fields = ['id', 'email'] 


class UserSerializer(serializers.ModelSerializer): 
    emails = EmailSerializer(many=True) 

Tuttavia, questo si tradurrà in una leggermente diversa struttura di dati:

[{ 
    'someUserField': 'foobar', 
    'emails': [ 
     {'id': 1, 'email': '[email protected]'}, 
     {'id': 2, 'email': '[email protected]'}, 
    ] 
}, { 
    ... 
}] 

Se non si desidera che questa struttura dati, è possibile creare un custom field

Oppure ... se si sta utilizzando postgresql si dovrebbe essere in grado di fare questo:

from django.contrib.postgres.fields import ArrayField 

class UserData(models.Model): 
    emails = ArrayField(models.EmailField(), blank=True) 
+0

Ci ho pensato. C'è troppo fastidio nel creare una o più associazioni. Preferisco che sia memorizzato come una matrice di ID e-mail. Un semplice trucco potrebbe essere quello di aggiungere più e-mail con "," (virgola). Ma spero che drf possa dare una risposta JSON come array. – Rahul

+0

Bene, dal momento che stai usando django e un database relazionale, questo è il modo giusto di fare le cose. Ma, se stai usando postgres, puoi provare il nuovo [campo JSON] (https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#django.contrib.postgres.fields. JSONField) – demux

+0

DRF è anche molto flessibile e il codice sorgente è chiaro. Puoi estrarre tutti i tipi di acrobazie folli utilizzando campi personalizzati. In ogni caso un 'CharField' non è la scelta giusta per un campo di posta elettronica multiplo. Leggi questo: [Django List Field In Model] (http://stackoverflow.com/questions/22340258/django-list-field-in-model) – demux

Problemi correlati