簡體   English   中英

Django postgresql外鍵

[英]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 REPLICATIONCREATE TABLE文檔中所述。

暫無
暫無

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

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