【问题标题】:Django: update choices field using human readable value?Django:使用人类可读值更新选择字段?
【发布时间】:2017-05-30 14:28:34
【问题描述】:

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

我的数据源包含“English”和“Welsh”,而不是“EN”和“CY”。

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

【问题讨论】:

  • 你的问题解决了吗??
  • 嗨,Richard,您可以使用以下方法检查 LANGUAGE_CHOICES 字段中的人类可读名称: key = [x[0] for x in LANGUAGE_CHOICES if 'English' in x] 并将此键传递给插入语句所需格式

标签: python django django-models


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为应该是:

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

    【讨论】:

      【解决方案3】:

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

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

      注意:每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。在您的情况下,实际值也是人类可读的名称。您还应该使用更大的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了解更多详情。

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        相关资源
        最近更新 更多