【问题标题】:django sequence:item 4 expected string or unicode int founddjango 序列:找到第 4 项预期的字符串或 unicode int
【发布时间】:2018-04-06 14:16:24
【问题描述】:

我正在使用我的模型运行 python manage.py migrate,数据库已经创建,我现在只是为它制作模型, 但是运行命令时出现此错误

TypeError: Error when calling the metaclass bases
    sequence item 4: expected string or Unicode, int found

我的模型

class Publisher(models.Model):
    publisherCode = models.CharField(3,primary_key=True)
    publisherName = models.CharField(25)
    city = models.CharField(20)

class Book(models.Model):
    bookCode = models.CharField(4,primary_key=True)
    title = models.CharField(40)
    publisherCode = models.ForeignKey(Publisher)
    type = models.CharField(3)
    paperback = models.CharField(1)

class Branch(models.Model):
    branchNum = models.DecimalField(2,0,primary_key=True)
    branchName = models.CharField(50)
    branchLocation = models.CharField(50)

class Copy(models.Model):
    bookCode = models.ForeignKey(Book)
    branchNum = models.ForeignKey(Branch)
    copyNum = models.DecimalField(2,0,primary_key=True)
    quality = models.CharField(20)
    price = models.DecimalField(8,2)

【问题讨论】:

标签: python django models


【解决方案1】:

简答:max_length 生成一个明确命名的参数。

基于source codemax_length 不是CharField 的显式参数,因此它执行对Field__init__ 的调用,并且 this 作为参数:

def __init__(self, verbose_name=None, name=None, primary_key=False,
             max_length=None, unique=False, blank=False, null=False,
             db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
             serialize=True, unique_for_date=None, unique_for_month=None,
             unique_for_year=None, choices=None, help_text='', db_column=None,
             db_tablespace=None, auto_created=False, validators=(),
             error_messages=None):

如您所见,您的第一个未命名参数实际上将匹配verbose_name,这应该是一个字符串。当然,将数字作为字符串提供不会解决问题,因为你将max_length 传递给verbose_name,此外,据我所知max_length 是必需的CharField 的参数。

解决方案是显式使用max_length,这样您就可以清楚地将4 分配给该参数。顺便说一句,DecimalField 也是如此:

class Publisher(models.Model):
    publisherCode = models.CharField(max_length=3,primary_key=True)
    publisherName = models.CharField(max_length=25)
    city = models.CharField(max_length=20)

class Book(models.Model):
    bookCode = models.CharField(max_length=4,primary_key=True)
    title = models.CharField(max_length=40)
    publisherCode = models.ForeignKey(Publisher)
    type = models.CharField(max_length=3)
    paperback = models.CharField(max_length=1)

class Branch(models.Model):
    branchNum = models.DecimalField(max_digits=2, decimal_places=0, primary_key=True)
    branchName = models.CharField(max_length=50)
    branchLocation = models.CharField(max_length=50)

class Copy(models.Model):
    bookCode = models.ForeignKey(Book)
    branchNum = models.ForeignKey(Branch)
    copyNum = models.DecimalField(max_digits=2, decimal_places=0, primary_key=True)
    quality = models.CharField(max_length=20)
    price = models.DecimalField(max_digits=8, decimal_places=2)

这也更“不言自明”:一个没有太多 Django 经验的用户,通常可以猜到 max_length=3 意味着字符串最多可以包含三个字符,而没有显式命名,他/她应该必须查找这个参数的确切含义。

我觉得将DecimalFielddecimal_places=0 一起使用很奇怪,因为这基本上是IntegerField,通常在这种情况下最好使用IntegerField,因为它更直接地映射到它的内容从概念上讲,数据库可以以更紧凑的方式存储它,算术运算通常在整数域中是正确的,而在浮点域中,可能会出现舍入错误。

【讨论】:

  • 哦,非常棒,是的,小数部分不是我做的:p
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 2012-06-08
  • 2018-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2020-09-09
相关资源
最近更新 更多