2010-02-20 79 views
0

你好我使用下面的模型來建立一個數據庫Django的數據庫many2many關係錯誤

from django.db import models 
from django.contrib import admin 


class Team(models.Model): 
    """Model docstring""" 
    slug = models.SlugField(max_length=200) 
    Team_ID = models.AutoField(primary_key=True) 
    Team_Name = models.CharField(max_length=100,) 
    College = models.CharField(max_length=100,) 
    College = models.CharField(max_length=1,) 
    Win = models.IntegerField() 
    Loss = models.IntegerField() 
    Draw = models.IntegerField() 

class Match(models.Model): 

    Match_Id = models.AutoField(primary_key=True) 
    Team_one = models.ManyToManyField('Team',related_name='Team one',symmetrical=False,) 
    Team_two = models.ManyToManyField('Team',related_name='Team two',symmetrical=False,) 
    stadium = models.CharField(max_length=255, blank=True) 
    Start_time = models.DateTimeField(auto_now_add=False, auto_now=False, blank=True, null=True) 
    Rafree = models.CharField(max_length=255, blank=True) 
    Judge = models.CharField(max_length=255, blank=True) 
    winner = models.ForeignKey('Team', related_name='winner',to_field='Team_Name')  
    updated = models.DateTimeField('update date', auto_now=True) 
    created = models.DateTimeField('creation date', auto_now_add=True) 

當我運行manage.py sqlall模型驗證罰款,給我的SQL輸出如下

BEGIN; 
CREATE TABLE "cupmanager_player" (
    "slug" varchar(200) NOT NULL, 
    "Player_Id" serial NOT NULL PRIMARY KEY, 
    "Player_Name" varchar(100) NOT NULL, 
    "Nick" varchar(100) NOT NULL, 
    "Jersy_Number" integer NOT NULL, 
    "Team_id_id" integer NOT NULL, 
    "Poistion" varchar(1) NOT NULL, 
    "Red_card" integer NOT NULL, 
    "Yellow_card" integer NOT NULL, 
    "Points" integer NOT NULL 
) 
; 
CREATE TABLE "cupmanager_team" (
    "slug" varchar(200) NOT NULL, 
    "Team_ID" serial NOT NULL PRIMARY KEY, 
    "Team_Name" varchar(100) NOT NULL, 
    "College" varchar(1) NOT NULL, 
    "Win" integer NOT NULL, 
    "Loss" integer NOT NULL, 
    "Draw" integer NOT NULL 
) 
; 
ALTER TABLE "cupmanager_player" ADD CONSTRAINT "Team_id_id_refs_Team_ID_1a532b57"     FOREIGN KEY ("Team_id_id") REFERENCES "cupmanager_team" ("Team_ID") DEFERRABLE INITIALLY  DEFERRED; 
CREATE TABLE "cupmanager_match" (
    "Match_Id" serial NOT NULL PRIMARY KEY, 
    "stadium" varchar(255) NOT NULL, 
    "Start_time" timestamp with time zone, 
    "Rafree" varchar(255) NOT NULL, 
    "Judge" varchar(255) NOT NULL, 
    "winner_id" varchar(100) NOT NULL REFERENCES "cupmanager_team" ("Team_Name")  DEFERRABLE INITIALLY DEFERRED, 
    "updated" timestamp with time zone NOT NULL, 
    "created" timestamp with time zone NOT NULL 
) 
; 
CREATE TABLE "cupmanager_goal" (
    "Goal_ID" serial NOT NULL PRIMARY KEY, 
    "Match_ID_id" integer NOT NULL REFERENCES "cupmanager_match" ("Match_Id")  DEFERRABLE INITIALLY DEFERRED, 
    "Team_ID_id" varchar(100) NOT NULL REFERENCES "cupmanager_team" ("Team_Name") DEFERRABLE INITIALLY DEFERRED, 
    "Player_ID_id" varchar(100) NOT NULL REFERENCES "cupmanager_player" ("Player_Name") DEFERRABLE INITIALLY DEFERRED, 
    "name" varchar(100) NOT NULL, 
    "updated" timestamp with time zone NOT NULL, 
    "created" timestamp with time zone NOT NULL 
) 
; 
CREATE TABLE "cupmanager_match_Team_one" (
    "id" serial NOT NULL PRIMARY KEY, 
    "match_id" integer NOT NULL REFERENCES "cupmanager_match" ("Match_Id") DEFERRABLE INITIALLY DEFERRED, 
    "team_id" integer NOT NULL REFERENCES "cupmanager_team" ("Team_ID") DEFERRABLE INITIALLY DEFERRED, 
    UNIQUE ("match_id", "team_id") 
) 
; 
CREATE TABLE "cupmanager_match_Team_two" (
    "id" serial NOT NULL PRIMARY KEY, 
    "match_id" integer NOT NULL REFERENCES "cupmanager_match" ("Match_Id") DEFERRABLE INITIALLY DEFERRED, 
    "team_id" integer NOT NULL REFERENCES "cupmanager_team" ("Team_ID") DEFERRABLE INITIALLY DEFERRED, 
    UNIQUE ("match_id", "team_id") 
) 
; 
CREATE INDEX "cupmanager_player_slug" ON "cupmanager_player" ("slug"); 
CREATE INDEX "cupmanager_player_Team_id_id" ON "cupmanager_player" ("Team_id_id"); 
CREATE INDEX "cupmanager_team_slug" ON "cupmanager_team" ("slug"); 
CREATE INDEX "cupmanager_match_winner_id" ON "cupmanager_match" ("winner_id"); 
CREATE INDEX "cupmanager_goal_Match_ID_id" ON "cupmanager_goal" ("Match_ID_id"); 
CREATE INDEX "cupmanager_goal_Team_ID_id" ON "cupmanager_goal" ("Team_ID_id"); 
CREATE INDEX "cupmanager_goal_Player_ID_id" ON "cupmanager_goal" ("Player_ID_id"); 
COMMIT; 

但是當我現在運行manage.py執行syncdb命令我碰到下面的錯誤 psycopg2.ProgrammingError: there is no unique constraint matching given keys for referenced table "cupmanager_team"

任何想法是怎麼回事呢?我使用postgresql作爲數據庫後端和Postgresql_psycopg2作爲數據庫後端

回答

1

Mmh你真的必須使用自己的主鍵字段嗎?如果沒有指定一個主鍵字段,比Django的自動創建一個名爲id場。我沒有看到從命名字段中獲益,例如match_id,尤其是當你想這個領域以後訪問,它看起來就像match.match_id
所以,或許是工作沒有你的自定義主鍵字段。

也不該選項symmetrical僅如果該字段引用自我,即自己的表,你是不是在這裏做考慮。

+0

是太感謝你了,這是問題。這不是創造一個約束,因爲我有一個自定義的主鍵我已經刪除了所有的Team_id字段,現在它的工作完美:) – 2010-02-20 23:29:41

+0

@nashr rafeeg:從我的角度來看,你的方法應該也一直工作。但讓框架儘可能多;) – 2010-02-20 23:31:42