我有两种型号:
class CachedRecord(models.Model):
recordname = models.CharField(max_length=100,primary_key=True)
recordcount = models.IntegerField()
def __unicode__(self):
return self.recordname
class CachedRecordData(models.Model):
record = models.ForeignKey(CachedRecord)
data = models.CharField(max_length=100)
def __unicode__(self):
return self.data
当我试图从管理面板中删除CachedRecord时,出现以下错误:
^{pr2}$我发现了很多问题(所以这可能是重复的),但我真的不明白任何答案。在
在django我需要在哪里添加这些铸件?在
这个问题被问/回答已经有几年了,但我今天碰到了同一个问题,找到了公认的答案,而“easy”并没有真正解决意外数据库表类型的潜在问题。Django是为用户定义的主键“正确管理密钥”而构建的。
我遇到了一个类似的问题,
ProgrammingError: operator does not exist: character = uuid
。在在将Django项目的MySQL数据库迁移到PostgreSQL之后,我遇到了这个问题。MySQL没有本机UUID字段,因此它用
VARCHAR(32)
表示models.UUIDField
。迁移之后,PostgreSQL中的字段类型也被创建为character(32)
。必须使用grei命令行中的alter sql类型来解决问题:ALTER TABLE my_table ALTER COLUMN my_field TYPE uuid USING uuid::uuid;
这会将字段类型强制转换为Django希望找到的PostgreSQL的本机UUID类型。在
我猜OP在
CachedRecord
表之后添加了recordname
字段,必须使用Django在未定义主键时默认创建的integer ID字段recordname
字段。添加新的recordname
字段作为主键后,OP需要更新现有关系以使用新的主键。在我想我为你找到了解决办法。我完全理解并尊重其他人在这里所说的关于使用整型字段作为主键的说法,默认情况下这确实是Django所做的。因此,如果改变数据库的结构是一个可能的选择,那么请先这样做!!在
但是如果你和我一样,最后遇到了这样的问题,使用Django的默认值对你来说不是一个选择,我就改变了主键的字段类型。最初我有:
改为文本域!在
^{pr2}$我猜这可能是Django试图构造/索引charfield作为主键的方式的一个bug?我不确定。在
希望有帮助!在
您已经将字符字段(
recordname
)设置为CachedRecord
的主键。在Django为
CachedRecordData
创建了一个名为id
的自动主键(整数类型),因为模型定义中没有指定主键。在现在,当您试图删除
CachedRecord
时,django正在创建一个主键查找,以确保所有相关的CachedRecordData
实例都被删除了,而且由于一个键是字符,另一个是整数,所以数据库给出了这个错误。在解决此问题的最简单方法是从
recordname
中删除primary_key=True
,并让django正确地管理密钥。始终可以在该列上添加索引或其他约束(例如,setunique=True
)。在你也有类似的问题:
您正在添加一个带有
^{pr2}$self.recordcount
的字符串':'
,这将导致TypeError
异常,因为不能将字符串与数字组合:要解决这个问题:
相关问题 更多 >
编程相关推荐