簡體   English   中英

Django和Postgresql運算符不存在:整數=字符變化

[英]Django and Postgresql operator does not exist: integer = character varying

我有以下兩種模型:

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,注釋,美味:沒有運算符匹配給定的名稱和參數類型。 您可能需要添加顯式類型轉換

沒有運算符匹配給定的名稱和參數類型。 您可能需要添加顯式類型轉換。 -Netbeans,Postgresql 8.4和Glassfish

我在哪里需要在Django中添加這些鑄件?

問/回答這個問題已經有兩年了,但是我今天遇到了同樣的問題,並找到了可以接受的答案,而“ easy”並沒有真正解決數據庫表類型意外的根本問題。 Django的構建目的是“正確管理鍵”,以供用戶定義的主鍵使用。

我用ProgrammingError: operator does not exist: character = uuid消息遇到了類似的問題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已經使用Django默認創建的整數ID字段(如果未定義primary_key)將CachedRecord表已經添加到CachedRecordData之后,將recordname字段添加到了CachedRecord中。 在將新的記錄recordname字段添加為主鍵之后,OP需要更新現有關系以使用新的主鍵。

您已將一個字符字段( 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)

我想我為您找到了解決方案。 我完全理解並尊重其他人在這里所說的關於使用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作為主鍵構造/索引的方式的錯誤嗎? 我不確定。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM