gpt4 book ai didi

python - 带有默认字段的Django模型序列化问题

转载 作者:行者123 更新时间:2023-11-29 12:23:51 25 4
gpt4 key购买 nike

在我的应用程序模型中,我使用 IntegerRangeField 字段:

from django.db import models
from django.contrib.postgres.fields import IntegerRangeField
from django.contrib.postgres.validators import RangeMinValueValidator, RangeMaxValueValidator
from psycopg2.extras import NumericRange


class MyModel(models.Model):
...

field = IntegerRangeField(default=NumericRange(400, 600), validators=[
RangeMinValueValidator(1),
RangeMaxValueValidator(1000)
])
...

default”属性仅在管理面板 UI 中使用,其他任何地方都不需要。

如果我在迁移后添加它们,它们会顺利运行。但是,如果我在运行 makemigrations 之前添加它们,我会收到此消息:

ValueError: Cannot serialize: NumericRange(400, 600, '[)') There are some values Django cannot serialize into migration files.

我什至不希望将默认值保存到我的 PostgreSQL 数据库中,我只是不想在每次运行 makemigrations 时都删除并恢复它们。

有什么想法吗?

(无效:具有“较低”和“较高”属性的自定义对象、单个整数、字符串、元组)

Python:3.6.6,Django:2.1.2,PostgreSQL:11.0

最佳答案

编辑 我应该指出原来的问题是 2 年前的,但至少在 django 3.1 中,它们是一个序列化程序,您必须单独注册。

你需要注册django提供的serializer。

from psycopg2.extras import NumericRange
from django.contrib.postgres.serializers import RangeSerializer
from django.db.migrations.writer import MigrationWriter

MigrationWriter.register_serializer(NumericRange, RangeSerializer)

这部分不在文档中,但您可以按预期添加默认值:

class AgeDivision(models.Model):
name = models.CharField(max_length=50, unique=True)
age_range = fields.IntegerRangeField(
unique=True, blank=True, default=NumericRange(None, None))

至于放在哪里,只需要放在任何只加载一次的模块旁边即可。该文档没有指定放置自定义序列化程序的位置(至少我能找到),但我会说将它们放在需要序列化程序的任何应用程序的 migrations/__init__.py 文件中。这是关于迁移序列化的文档:https://docs.djangoproject.com/en/3.1/topics/migrations/#custom-serializers

关于python - 带有默认字段的Django模型序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com