Django 本身没有内置的数组字段,但你可以使用逗号分隔的字符串、JSON 字符串或自定义模型字段来模拟数组。

一种实现自定义数组模型字段的方法是使用 Python 列表存储值,并使用自定义字段来序列化和反序列化列表。

以下是一个示例:

import json
from django.db import models


class ArrayField(models.TextField):
    '自定义数组模型字段。'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def from_db_value(self, value, expression, connection):
        if value is None:
            return []
        return json.loads(value)

    def to_python(self, value):
        if isinstance(value, list):
            return value
        if value is None:
            return []
        return json.loads(value)

    def get_prep_value(self, value):
        if value is None:
            return ''
        return json.dumps(value)

    def value_to_string(self, obj):
        value = self._get_val_from_obj(obj)
        return self.get_prep_value(value)

使用此自定义字段,你可以定义一个存储数组的模型字段:

class MyModel(models.Model):
    my_array = ArrayField()

你也可以定义 getter 和 setter 方法来操作数组:

class MyModel(models.Model):
    my_array = ArrayField()

    def get_my_array(self):
        return self.my_array

    def set_my_array(self, value):
        self.my_array = value

    my_array_property = property(get_my_array, set_my_array)

现在你可以使用 my_array_property 属性来获取和设置数组:

>>> instance = MyModel.objects.create(my_array=[1, 2, 3])
>>> instance.my_array_property
[1, 2, 3]
>>> instance.my_array_property = [4, 5, 6]
>>> instance.my_array
[4, 5, 6]
Django 自定义数组字段:Getter、Setter 和 Model Field 实现

原文地址: https://www.cveoy.top/t/topic/mJjt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录