Django和Postgresql运算符不存在:integer=字符可变

2024-10-01 13:41:15 发布

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

我有两种型号:

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}$

我发现了很多问题(所以这可能是重复的),但我真的不明白任何答案。在

heroku, postgreSQL, django, comments, tastypie: No operator matches the given name and argument type(s). You might need to add explicit type casts

No operator matches the given name and argument type(s). You might need to add explicit type casts. -- Netbeans, Postgresql 8.4 and Glassfish

在django我需要在哪里添加这些铸件?在


Tags: andselfdatamodelreturnmodelsdeftype
3条回答

这个问题被问/回答已经有几年了,但我今天碰到了同一个问题,找到了公认的答案,而“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的默认值对你来说不是一个选择,我就改变了主键的字段类型。最初我有:

Username = models.CharField(max_length=1024, primary_key=True, unique=True)

改为文本域!在

^{pr2}$

我猜这可能是Django试图构造/索引charfield作为主键的方式的一个bug?我不确定。在

希望有帮助!在

您已经将字符字段(recordname)设置为CachedRecord的主键。在

Django为CachedRecordData创建了一个名为id的自动主键(整数类型),因为模型定义中没有指定主键。在

现在,当您试图删除CachedRecord时,django正在创建一个主键查找,以确保所有相关的CachedRecordData实例都被删除了,而且由于一个键是字符,另一个是整数,所以数据库给出了这个错误。在

解决此问题的最简单方法是从recordname中删除primary_key=True,并让django正确地管理密钥。始终可以在该列上添加索引或其他约束(例如,set unique=True)。在

你也有类似的问题:

def __unicode__(self):
    return self.recordname+":"+self.recordcount

您正在添加一个带有self.recordcount的字符串':',这将导致TypeError异常,因为不能将字符串与数字组合:

^{pr2}$

要解决这个问题:

def __unicode__(self):
    return u'{}:{}'.format(self.recordname, self.recordcount)

相关问题 更多 >