2016-01-06 20 views
5

我有一個創建的存儲在我的模型以下列方式EMAIL_ID列表 Models.pyDjango的REST框架:基於DRF <a href="http://www.django-rest-framework.org/api-guide/fields/#listfield" rel="nofollow">documentation</a>正確的方式來序列ListFields

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

在我serializers.py文件

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

發佈數據時,drf頁面顯示預期格式的數據,即

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

但是,如果我使用python或任何其他客戶端查詢相同的數據。我得到的數據按以下格式

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

理想的情況下,它應該是

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

我不知道,究竟什麼是錯在這裏。有什麼建議麼 ?

回答

1

您的模型只有一個電子郵件字段。它不支持在數據庫中存儲多個 電子郵件。你需要的是這樣的:

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) 

然而,這將導致一個稍微不同的數據結構:

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

如果你不想這樣的數據結構,你可以創建一個custom field

或者......如果你正在使用postgresql你應該能夠做到這一點:

from django.contrib.postgres.fields import ArrayField 

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

我想過那個。在創建一對多協會方面有太多麻煩。我寧願將它存儲爲一個電子郵件ID數組。一個簡單的黑客就是用「,」(逗號)追加多個電子郵件。但我希望drf能夠將數組作爲json響應。 – Rahul

+0

好吧,由於您使用的是django和關係數據庫,這只是正確的做事方式。但是,如果您使用的是Postgres,則可以嘗試新的[JSON字段](https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#django.contrib.postgres.fields。 JSONField) – demux

+0

DRF也非常靈活,源代碼清晰。你可以使用自定義字段來吸引各種瘋狂的特技。在任何情況下,CharField不是多郵件字段的正確選擇。閱讀本文:[模型中的Django列表字段](http://stackoverflow.com/questions/22340258/django-list-field-in-model) – demux

相關問題