2016-01-06 16 views
5

podstawie DRF documentation mam stworzył listę email_id przechowywane w moim modelu w następujący sposób Models.pyDjango Reszta ramowa: Prawidłowy sposób serializacji ListFields

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

W moim pliku serializers.py

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

Podczas publikowania danych strona drf pokazuje dane w oczekiwanym formacie, tj.

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

Ale, jeśli zapytanie o te same dane za pomocą Pythona lub dowolnego klienta odpoczynku. Mam dane w następującym formacie

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']'] 

Idealnie powinno być

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

Nie jestem pewien, co dokładnie jest nie tak tutaj. Jakieś sugestie ?

Odpowiedz

1

Twój model ma tylko jedno pole e-mail. Nie obsługuje przechowywania wielu wiadomości e-mail w bazie danych. Co potrzebne jest coś takiego:

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) 

Jednak spowoduje to w nieco innej struktury danych:

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

Jeśli nie chcą tej struktury danych, można utworzyć custom field

... Lub jeśli używasz postgresql powinieneś być w stanie to zrobić:

from django.contrib.postgres.fields import ArrayField 

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

Myślałem o tym. Jest zbyt wiele kłopotów w tworzeniu jednego do wielu skojarzeń. Raczej mam to zapisane jako tablicę identyfikatorów e-mail. Jednym łatwym hackiem byłoby dołączanie wielu e-maili z "," (przecinek). Ale mam nadzieję, że drf da odpowiedź json jako tablicę. – Rahul

+0

Cóż, ponieważ używasz django i relacyjnej bazy danych, jest to po prostu właściwy sposób robienia rzeczy. Ale jeśli używasz postgresów, możesz wypróbować nowe pole [JSON Field] (https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#django.contrib.postgres.fields. JSONField) – demux

+0

DRF jest również bardzo elastyczny, a kod źródłowy czytelny. Możesz wykonywać wszystkie rodzaje szalonych akrobacji za pomocą pól niestandardowych. W każdym razie 'CharField' nie jest właściwym wyborem dla wielu pól e-mail. Przeczytaj: [Pole listy Django w modelu] (http://stackoverflow.com/questions/22340258/django-list-field-in-model) – demux