我有一个长整数的列表,我分配给django模型charfield.long列表被转换为unicode列表



我有一个长整数列表,我分配给django模型Charfield。long类型的列表被转换为unicode类型的列表。

other_parents = models.CharField(max_length=300, blank=True)
final_list = [1L, 2L, 11L, 84L]
self.parent_list = final_list
print self.parent_list

print [u'1', u'2', u'11', u'84']

基于Django文档:编写自定义模型字段,我创建了简单的字段LongListAsTextField(),它扩展了默认的django.db.models.TextField,并使用to_pythonget_prep_value方法将长列表从和转换为字符串。

models.py

from __future__ import absolute_import
from django.db import models
from .fields import LongListAsTextField
class Record(models.Model):
    parent_list = LongListAsTextField()

fields.py

from django.db

从django.utils. 6导入with_metaclass
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])

Record(parent_list=[1,2]).save()
record = Record.objects.last()
record.parent_list # returns [1L, 2L]

Django不需要你做任何事情就可以处理序列化和存储long列表到你的数据库CharField字段。你不需要自定义字段;CharField将使用bytes()转换列表,将其转换为UTF8,并将其存储在数据库中。你的列表可以包含字符串、数字、元组、列表、字典、布尔值和None,或者它们的组合。

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

在<<p> strong> your_app/models.py :
from django.db import models
class List(models.Model):
    the_list = models.CharField(max_length=300, blank=True)

Then in 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'u3030u3000', {'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

显示列表在数据库中成功往返。

最新更新