我有一个长整数列表,我分配给django模型字段。 long列表将转换为unicodes列表

时间:2014-07-15 04:15:15

标签: python django unicode

我有一个长整数列表,我分配给django模型Charfield。 long列表将转换为unicodes列表。

other_parents = models.CharField(max_length=300, blank=True)

final_list = [1L, 2L, 11L, 84L]
self.parent_list = final_list
print self.parent_list

打印[u' 1',u' 2',u' 11',u' 84']

我们可以把它作为长篇名单保留。

2 个答案:

答案 0 :(得分:2)

基于Django documentation: Writing custom model fields,我创建了简单字段LongListAsTextField(),该字段扩展了默认django.db.models.TextField,并将字符串列表转换为字符串to_python和{{1}方法。

<强> models.py

get_prep_value

<强> fields.py

来自django.db导入模型

来自django.utils.six导入with_metaclass

from __future__ import absolute_import

from django.db import models

from .fields import LongListAsTextField

class Record(models.Model):
    parent_list = LongListAsTextField()

<强>壳

class LongListAsTextField(with_metaclass(models.SubfieldBase, models.TextField)):

    def to_python(self, value):
        if isinstance(value, list):
           return value

        return [
            long(val)
            for val in value.split(',')
            if val.isdigit()
        ]

    def get_prep_value(self, value):
        return ','.join([str(val) for val in value])

答案 1 :(得分:0)

Django确实会将您的long列表序列化和存储到数据库CharField字段中,而无需执行任何操作。你不需要自定义领域; CharField将使用bytes()转换列表,将其转换为UTF8,并将其存储在数据库中。您的列表可能包含字符串,数字,元组,列表,dicts,布尔值和None,或其组合。

您遇到的问题是,当您从数据库中检索列表时,它将是一个unicode字符串,而不是Python列表。没问题,只要您将数据类型限制为上述数据类型,就可以使用ast.literal_eval()安全地解组列表:

your_app / models.py

from django.db import models

class List(models.Model):
    the_list = models.CharField(max_length=300, blank=True)

然后在python manage.py shell

>>> import ast
>>> from your_app.models import List

>>> original_list = [1, 2, 3, 444L, 1100L, -1234, 11.72, 'hi there', u'\u3030\u3000', {'a': 1, 'b': 2, 'c': [1, 2, 3]}, ('this', 'is', 'a', 'tuple'), True, None]
>>> List(the_list=original_list).save()
>>> retrieved_list = List.objects.last()
>>> retrieved_list
u"[1, 2, 3, 444L, 1100L, -1234, 11.72, 'hi there', u'\\u3030\\u3000', {'a': 1, 'c': [1, 2, 3], 'b': 2}, ('this', 'is', 'a', 'tuple'), True, None]"
>>> original_list == ast.literal_eval(retrieved_list.the_list)
True

这表明该列表已成功通过数据库往返。