如何在django中创建列表字段
如何在django中创建列表字段
在Django(Python)中如何创建类似于Google App Engine(Python)中的ListProperty的ListField?我的数据是一个像这样的列表:3,4,5,6,7,8
。
我需要定义什么属性,并且如何从中提取值?
在Django中创建列表字段的方法是使用CommaSeparatedIntegerField
,它在这里有详细的文档说明:http://docs.djangoproject.com/en/1.2/ref/models/fields/#commaseparatedintegerfield。如果你想要获取CommaSeparatedIntegerField
字段的单个值,请展示一下你的代码。如果你的数据是一个列表,比如[3,4,5]
,你可以像这样给CommaSeparatedIntegerField
赋值:my_object.my_field = ",".join([str(x) for x in my_list])
。App Engine原生支持列表,将它们以逗号分隔的形式存储似乎是一个糟糕的主意。需要注意的是,CommaSeparatedIntegerField
在2016年已被弃用。github.com/django/django/pull/6101。
如何在Django中创建列表字段
问题的出现原因:
在Django中,没有内置的列表字段类型,因此需要自定义一个列表字段类型来存储列表数据。在上述内容中,提到了两种解决方法。
解决方法一:
第一种方法是通过创建一个继承自TextField的ListField类来实现。这个类的作用是将列表数据存储为一个Unicode字符串,并在取出数据时使用ast.literal_eval()函数进行转换。
解决方法二:
第二种方法是创建一个继承自TextField的SeparatedValuesField类。这个类的作用是将列表数据存储为一个由分隔符分隔的字符串,并在取出数据时使用split()函数进行转换。
这两种方法都是通过自定义字段类型来实现列表字段的功能,但是方法一更加灵活,可以存储任意类型的数据,而方法二只能存储字符串类型的数据。
代码示例:
下面是方法一的代码示例:
from django.db import models import ast class ListField(models.TextField): __metaclass__ = models.SubfieldBase description = "Stores a python list" def __init__(self, *args, **kwargs): super(ListField, self).__init__(*args, **kwargs) def to_python(self, value): if not value: value = [] if isinstance(value, list): return value return ast.literal_eval(value) def get_prep_value(self, value): if value is None: return value return unicode(value) def value_to_string(self, obj): value = self._get_val_from_obj(obj) return self.get_db_prep_value(value) class Dummy(models.Model): mylist = ListField()
文章整理完毕。