【问题标题】:Django and Postgresql operator does not exist: integer = character varyingDjango 和 Postgresql 运算符不存在:整数 = 字符变化
【发布时间】:2015-10-02 23:33:11
【问题描述】:

我有这两个模型:

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 时,出现以下错误:

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.

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

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 中的哪里添加这些铸件?

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

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

    我在ProgrammingError: operator does not exist: character = uuid 的消息中遇到了类似的问题。

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

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

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

    我猜 OP 在 CachedRecord 表之后添加了 recordname 字段,如果没有定义 primary_key,则使用 Django 默认创建的整数 ID 字段到 CachedRecordData。添加新的recordname 字段作为主键后,OP 需要更新现有关系以使用新的主键。

    【讨论】:

      【解决方案2】:

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

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

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

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

      你这里也有类似的问题:

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

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

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

      解决这个问题:

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

      【讨论】:

      • 所以我不能有一个字符串主键?
      【解决方案3】:

      我想我找到了适合你的解决方案。我完全理解并尊重其他人在这里所说的关于使用 Integer 字段作为主键的内容,默认情况下这确实是 Django 所做的。因此,如果可以选择更改数据库的结构,请先这样做!

      但是,如果您像我一样遇到这样的问题并且无法使用 Django 的默认值,那么我更改了主键的字段类型。虽然最初我有:

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

      改为将其改为 TextField!

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

      这为我修复了它,我猜这可能是 Django 尝试将 charfield 构造/索引为主键的方式的错误?我不确定。

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 2014-06-30
        • 2021-11-15
        • 2018-12-16
        • 2011-07-03
        • 2020-03-19
        • 1970-01-01
        • 2017-06-23
        • 2012-02-06
        • 1970-01-01
        相关资源
        最近更新 更多