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

时间:2017-05-30 14:28:35

标签: python django django-models

我正在使用Django 1.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)

现在我要插入一个值:

report_obj, created = Report.object.update_or_create(
    company=company, language='English')

但这失败了:

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

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

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

3 个答案:

答案 0 :(得分:1)

如果您的现有数据库已填充此模型(' EN'),并且您没有兴趣迁移它,是的,您可以使用查找

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

答案 1 :(得分:-1)

我认为应该是:

# 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)

答案 2 :(得分:-1)

您收到以下错误,因为您尝试插入的值大于定义的max_length(max_length = 2):

  

psycopg2.DataError:类型字符变化的值太长(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)

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

report_obj, created = Report.object.update_or_create(company=company, language=Report.LANGUAGE_ENGLISH_CHOICE)

点击此处django docs了解详情。