2016-01-06 13 views
5

Basierend auf dem DRF documentation Ich habe eine Liste von email_id erstellt in der folgenden Art und Weise in meinem Modell Models.pyDjango Ruhe Framework: Richtiger Weg Listfields

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

In meiner serializers.py Datei

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

Während die Daten veröffentlichen, die DRF-Seite die Daten im erwarteten Format zeigt, das heißt

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

Aber, wenn ich die gleichen Daten mit Python oder einem Rest-Client abfragen. Ich erhalte die Daten in folgendem Format

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

Idealerweise sollte es

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

Ich bin nicht sicher, genau das, was hier nicht stimmt. Irgendwelche Vorschläge ?

Antwort

1

Ihr Modell hat nur ein E-Mail-Feld. Es unterstützt nicht das Speichern von mehreren E-Mails in der Datenbank. Was Sie brauchen, ist etwas Ähnliches:

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) 

Dies ist jedoch in einer etwas anderen Datenstruktur führen wird:

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

Wenn Sie nicht über diese Datenstruktur wollen Sie eine custom field

schaffen könnte

Oder ..., wenn Sie postgresql verwenden, sollten Sie diese in der Lage sein zu tun:

from django.contrib.postgres.fields import ArrayField 

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

Ich dachte darüber nach. Es gibt zu viel Aufwand beim Erstellen von einer zu vielen Assoziationen. Ich habe es lieber als ein Array von E-Mail-IDs gespeichert. Ein einfacher Hack wäre das Anhängen mehrerer E-Mails mit "," (Komma). Aber ich hoffe, dass drf JSON Antwort als Array geben wird. – Rahul

+0

Nun, da Sie Django und eine relationale Datenbank verwenden, ist dies genau der richtige Weg, um Dinge zu tun. Wenn Sie Postgres verwenden, können Sie das neue [JSON Field] (https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#django.contrib.postgres.fields) ausprobieren. JSONField) – demux

+0

DRF ist auch sehr flexibel und der Quellcode klar. Sie können alle Arten von verrückten Stunts mit benutzerdefinierten Feldern durchführen. In jedem Fall ist ein 'CharField' nicht die richtige Wahl für ein Mehrfach-E-Mail-Feld. Lesen Sie dies: [Django-Listenfeld im Modell] (http://stackoverflow.com/questions/22340258/django-list-field-in-model) – demux

Verwandte Themen