如何在django中创建列表字段

10 浏览
0 Comments

如何在django中创建列表字段

在Django(Python)中如何创建类似于Google App Engine(Python)中的ListProperty的ListField?我的数据是一个像这样的列表:3,4,5,6,7,8

我需要定义什么属性,并且如何从中提取值?

0
0 Comments

在Django中创建列表字段的原因是为了保存和加载原生列表对象,无需进行转换。解决方法是使用django-jsonfield或Django原生的JSONField。django-jsonfield是一个经过充分测试和成熟的解决方案,它还具有其他优势,例如支持数据库和正则表达式的过滤。此外,django-jsonfield还支持跨数据库的使用,并且适用于Python 2.7到Python 3.4和Django 1.4到1.8版本。而Django原生的JSONField是一种更近期版本中更合理的做法。

0
0 Comments

在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

0
0 Comments

如何在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()

文章整理完毕。

0