【问题标题】:django database many2many relationship errorsdjango数据库many2many关系错误
【发布时间】:2010-02-20 20:02:15
【问题描述】:

您好,我正在使用以下模型来构建数据库

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 作为数据库后端

【问题讨论】:

    标签: python database django postgresql django-models


    【解决方案1】:

    嗯,您真的必须使用自己的主键字段吗?如果你没有指定主键字段,Django 会自动创建一个名为id 的字段。我没有看到命名字段的好处,例如match_id,特别是当你以后想访问这个字段时,它看起来像match.match_id
    因此,也许它可以在没有您的自定义主键字段的情况下工作。

    也不是说选项symmetrical 仅在字段引用自我时才考虑,即自己的表,您没有在这里做。

    【讨论】:

    • 是的,非常感谢,这就是问题所在。它没有创建约束,因为我有一个自定义主键我已经删除了所有 Team_id 字段并且它现在可以正常工作:)
    • @nashr rafeeg:从我的角度来看,您的方法也应该有效。但是尽可能让框架做;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多