Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架:序列化列表字段的正确方法_Python_Json_Rest_Django Rest Framework - Fatal编程技术网

Python Django Rest框架:序列化列表字段的正确方法

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

基于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 = 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甚至有。另外,忽略我发布的链接中已接受的答案。其他的更好。