Django创建Site对象报value too long for type character varying(50)如何解决
报错原因:Django 内置
Site模型的domain字段默认设置为varchar(50),你使用的 Elastic Beanstalk 域名总长度超过50字符,触发字段长度校验报错。
可行解决思路
方案1:修改默认Site模型字段长度(最推荐,改动最小)
无需重写Site类,直接通过自定义迁移修改默认字段的长度限制即可:
- 首先在已注册的任意业务app下生成空白迁移文件:
python manage.py makemigrations your_app_name --empty
- 编辑生成的迁移文件,添加修改
domain字段长度的操作:
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("your_app_name", "xxx_previous_migration"), # 替换为你的app上一个迁移的文件名 ("sites", "0001_initial"), ] operations = [ migrations.AlterField( model_name="site", name="domain", field=models.CharField(max_length=255, unique=True, verbose_name="domain name"), ), ]
- 执行迁移使修改生效:
python manage.py migrate
方案2:自定义Site模型替换默认实现(仅需扩展Site功能时选用)
如果你需要同时给Site添加其他自定义字段,可以自定义替换默认模型:
- 在你的业务app中定义继承自
AbstractSite的自定义模型:
from django.contrib.sites.models import AbstractSite from django.db import models class CustomSite(AbstractSite): # 调整domain字段长度为255,可按需添加其他自定义字段 domain = models.CharField(max_length=255, unique=True, verbose_name="domain name") class Meta: verbose_name = "site" verbose_name_plural = "sites"
- 在
settings.py中添加配置,指定使用自定义Site模型:
SITE_MODEL = "your_app_name.CustomSite" # 禁用默认sites app的迁移 MIGRATION_MODULES = { "sites": "your_app_name.sites_migrations" }
- 生成并执行新的迁移即可。
临时应急方案
如果暂时不想修改数据库结构,可以先给你的 Elastic Beanstalk 域名绑定一个长度更短的CNAME别名,将短别名填写到Site的domain字段即可正常使用。
内容的提问来源于stack exchange,提问作者user15256253
相关产品推荐
相关产品推荐

