Python Django Rest框架:序列化列表字段的正确方法
基于DRF,我创建了一个电子邮件id列表,以以下方式存储在我的模型中Python Django Rest框架:序列化列表字段的正确方法,python,json,rest,django-rest-framework,Python,Json,Rest,Django Rest Framework,基于DRF,我创建了一个电子邮件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 = ser
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或任何rest客户机查询相同的数据。我得到的数据格式如下
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']
我不确定这里到底出了什么问题。有什么建议吗?您的模型只有一个电子邮件字段。它不支持存储多个 数据库中的电子邮件。你需要的是这样的东西:
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'},
]
}, {
...
}]
如果不需要此数据结构,可以创建
或者。。。如果您使用的是postgresql
,您应该能够做到:
from django.contrib.postgres.fields import ArrayField
class UserData(models.Model):
emails = ArrayField(models.EmailField(), blank=True)
我想了想。创建一对多关联有太多的麻烦。我宁愿将其存储为电子邮件ID数组。一个简单的破解方法是在多封电子邮件中附加“,”(逗号)。但我希望drf能以数组的形式给出json响应,因为您使用的是django和关系数据库,所以这是正确的方法。但是,如果你正在使用postgres,你可以试试新的DRF,它也非常灵活,源代码也很清晰。您可以使用自定义字段完成各种疯狂特技。在任何情况下,
CharField
都不是多个电子邮件字段的正确选择。读这篇文章:实际上,postgres甚至有。另外,忽略我发布的链接中已接受的答案。其他的更好。