Django Rest Framework:序列化ListFields的正确方法

时间:2016-01-06 01:34:22

标签: python json rest django-rest-framework

基于DRF documentation我创建了一个以下列方式存储在我的模型中的email_id列表 Models.py

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": [
        "bal@bal.com"
    ],

但是,如果我使用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'] = ['bal@bal.com'] 

我不确定,这里到底出了什么问题。有什么建议吗?

1 个答案:

答案 0 :(得分: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': 'foo@bar.maz'},
        {'id': 2, 'email': 'bill@gates.ms'},
    ]
}, {
    ...
}]

如果您不想要此数据结构,可以创建custom field

或者......如果你使用的是postgresql,你应该可以这样做:

from django.contrib.postgres.fields import ArrayField

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