[英]Django postgresql foreign key
我有這個models.py
from django.db import models
from django.contrib.auth.models import User
class Service(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=800, blank=False)
service = models.CharField(max_length=2000, blank=False)
def __unicode__(self):
return self.name
class ServiceCheck(models.Model):
service = models.ForeignKey(Service)
check_status = models.CharField(max_length=80)
check_time = models.DateTimeField()
當我對postgresql運行syncdb時,它最終會出錯:
~/dev-md> sudo python manage.py syncdb
Creating tables ...
Creating table monitor_service
Creating table monitor_servicecheck
DatabaseError: Hash/Modulo distribution column does not refer to hash/modulo distribution column in referenced table.
乍一看,代碼看起來還不錯。 我懷疑這是一個與數據庫相關的問題。
由於提供的max_length
非常大,請嘗試將max_length
s減少到<= 255或使用TextField
而不是CharField
。
如果不這樣做,請嘗試在Service
和/或ServiceCheck
重命名現場service
。
您遇到的問題實際上與Postgres-XC / StormDB(或現在的Postgres-XL,我遇到此問題)如何處理不同數據節點之間的表分區有關。
基本上,問題是數據庫引擎無法保證對外鍵或唯一約束的約束。 根據StormDB站點上關於以前版本Django和Postgres-XC / StormDB的舊文章 ,您可以通過在數據庫上設置loose_constraints=true
來完成此操作。 在現代版本的Django(1.6或更高版本)中,等效似乎是根據Django的模型字段docs在ForeignKey上設置db_constraint=False
(我無法直接鏈接到,因為我沒有足夠的rep)。
如果您更關心可用性而不是性能,則另一種解決方案是復制數據,這意味着您不會遇到問題,因為所有數據節點都具有相同的數據。 我不知道有任何方法可以直接在Django中執行此操作,但您可以修改表創建以使用DISTRIBUTE BY REPLICATION
如CREATE TABLE文檔中所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.