Django 和 Postgresql 运算符不存在:整数 = 字符变化

use*_*021 4 python django postgresql

我有这两个模型:

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
Run Code Online (Sandbox Code Playgroud)

当我尝试从管理面板中删除 CachedRecord 时,出现以下错误:

ProgrammingError at /admin/myapp/cachedrecord/

operator does not exist: integer = character varying
LINE 1: ...ON ( "myapp_cachedrecorddata"."record_id" = "myapp...
                                                             ^
HINT:  No operator matches the given name and argument type(s).
You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

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

heroku、postgreSQL、django、comments、tastypie:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换

没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。-- Netbeans、Postgresql 8.4 和 Glassfish

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

小智 9

自从提出/回答这个问题已经有几年了,但我今天遇到了同样的问题并找到了公认的答案,而“简单”并没有真正解决意外数据库表类型的潜在问题。Django 旨在为用户定义的主键“正确管理键”就好了。

我遇到了类似的问题,有一条消息ProgrammingError: operator does not exist: character = uuid

在将我的 Django 项目的 MySQL 数据库迁移到 PostgreSQL 后,我遇到了这个问题。MySQL 没有本机 UUID 字段,因此它表示models.UUIDField带有VARCHAR(32). 迁移后,PostgreSQL 中的字段类型也被创建为character(32). 为了解决这个问题,我必须使用 PostgreSQL 命令行更改字段类型:

ALTER TABLE my_table ALTER COLUMN my_field TYPE uuid USING uuid::uuid;

这会将字段类型转换为 Django 期望找到的 PostgreSQL 的本机 UUID 类型。

我猜 OPrecordnameCachedRecord表已经必须CachedRecordData使用 Django 默认创建的整数 ID字段之后添加了该字段,如果未定义 primary_key 。添加新recordname字段作为主键后,OP 需要更新现有关系以使用新的主键。


Bur*_*lid 5

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

CachedRecordDataDjango 为调用创建了一个自动主键(整数类型)id- 因为模型定义中没有指定主键。

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

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

你这里也有类似的问题:

def __unicode__(self):
    return self.recordname+":"+self.recordcount
Run Code Online (Sandbox Code Playgroud)

':'您添加的字符串self.recordcount将导致TypeError异常,因为您不能将字符串与数字组合:

>>> ':'+3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Run Code Online (Sandbox Code Playgroud)

要解决这个问题:

def __unicode__(self):
    return u'{}:{}'.format(self.recordname, self.recordcount)
Run Code Online (Sandbox Code Playgroud)

  • 所以我不能有字符串主键? (2认同)