基于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']
我不确定,这里到底出了什么问题。有什么建议吗?
答案 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)