Django:使用人类可读值更新选项字段?

2024-05-15 20:04:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是django1.9。我有一个模型如下:

class Report(models.Model):
    LANGUAGE_CHOICES = (
        ('EN', 'English'),
        ('CY', 'Welsh')
    )
    company = models.ForeignKey(Company)
    language = models.CharField(
        max_length=2,
        choices=LANGUAGE_CHOICES,
        default='EN'
    )
    pdf_url = models.URLField(blank=True)

现在我要插入一个值:

^{pr2}$

但这失败的原因是:

psycopg2.DataError: value too long for type character varying(2)

我的数据源包含“英语”和“威尔士语”,而不是“EN”和“CY”。在

如何使用人类可读的名称进行更新?或者我需要维护一个单独的查找列表,从人类可读的名称到导入脚本中的短值?在


Tags: 模型report名称modelenglishmodels人类language
3条回答

我认为应该是:

# models
EN = 1
CY = 2

LANGUAGE_CHOICES = (
    (EN, 'English'),
    (CY, 'Welsh')
)

# then insert
report_obj, created = Report.object.update_or_create(
company=company, language=Report.EN)

出现以下错误是因为您试图插入一个大于定义的max_length(max_length=2)的值:

psycopg2.DataError: value too long for type character varying(2)

NB:每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。在您的例子中,实际值也是人类可读的名称。您还应该使用更大的max_length值,因为您将使用人类可读的名称格式。定义您的选择如下:

class Report(models.Model):
    LANGUAGE_ENGLISH_CHOICE = 'English'
    LANGUAGE_WELSH_CHOICE = 'Welsh'
    LANGUAGE_CHOICES = (
        (LANGUAGE_ENGLISH_CHOICE, 'English'),
        (LANGUAGE_CHOICES, 'Welsh')
    )
    company = models.ForeignKey(Company)
    language = models.CharField(
        max_length=100,
        choices=LANGUAGE_CHOICES,
        default=LANGUAGE_ENGLISH_CHOICE
    )
    pdf_url = models.URLField(blank=True)

然后按如下方式创建对象:

^{pr2}$

查看此处django docs了解更多详细信息。在

如果您的现有数据库已经填充了此模型(“EN”),并且您对迁移它不感兴趣,可以使用查找

CHOICES_LANGUAGE = dict(map(reversed, Report.LANGUAGE_CHOICES))
...
language=CHOICES_LANGUAGE['English']

相关问题 更多 >