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

Rah*_*hul 6 python rest json django-rest-framework

根据DRF 文档,我创建了一个以下列方式存储在我的模型中的email_id列表 Models.py

class UserData(models.Model):
  emails = models.CharField(max_length=100,blank=False)
Run Code Online (Sandbox Code Playgroud)

在我的serializers.py档案中

class UserSerializer(serializers.ModelSerializer):
    emails = serializers.ListField(child = serializers.EmailField())
Run Code Online (Sandbox Code Playgroud)

在发布数据时,drf页面以预期的格式显示数据,即

"emails": [
        "bal@bal.com"
    ],
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用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']']
Run Code Online (Sandbox Code Playgroud)

理想情况下,应该是

d['emails'] = ['bal@bal.com'] 
Run Code Online (Sandbox Code Playgroud)

我不确定,这里究竟出了什么问题.有什么建议 ?

dem*_*mux 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)
Run Code Online (Sandbox Code Playgroud)

但是,这将导致数据结构略有不同:

[{
    'someUserField': 'foobar',
    'emails': [
        {'id': 1, 'email': 'foo@bar.maz'},
        {'id': 2, 'email': 'bill@gates.ms'},
    ]
}, {
    ...
}]
Run Code Online (Sandbox Code Playgroud)

如果您不想要这种数据结构,您可以创建一个自定义字段

或者...如果您正在使用,postgresql您应该能够执行以下操作:

from django.contrib.postgres.fields import ArrayField

class UserData(models.Model):
    emails = ArrayField(models.EmailField(), blank=True)
Run Code Online (Sandbox Code Playgroud)