【问题标题】:Django Rest Framework: Correct way to serialize ListFieldsDjango Rest Framework:序列化 ListFields 的正确方法
【发布时间】:2016-04-10 00:29:55
【问题描述】:

基于 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'] 

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

【问题讨论】:

    标签: python json rest django-rest-framework


    【解决方案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)
    

    【讨论】:

    • 我想过。创建一对多关联太麻烦了。我宁愿将其存储为电子邮件 ID 数组。一种简单的技巧是在多封电子邮件中附加“,”(逗号)。但我希望 drf 将 json 响应作为数组提供。
    • 好吧,既然您使用的是 django 和关系数据库,那么这正是做事的正确方式。但是,如果你使用的是 postgres,你可以试试新的 JSON Field
    • DRF 也非常灵活,源代码清晰。您可以使用自定义字段完成各种疯狂的特技。在任何情况下,CharField 都不是多电子邮件字段的正确选择。阅读:Django List Field In Model
    • 其实postgres 甚至还有ArrayField。另外,请忽略我发布的链接中接受的答案。其他的更好。
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2015-10-01
    • 2013-02-02
    • 2018-10-26
    • 2015-04-17
    • 2016-09-28
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多