外键需要键表中的值以匹配另一个表中的列

时间:2009-10-21 15:21:25

标签: python database django

请原谅过多的代码,但我不确定我是否可以解释我的问题

我正在处理一个Django项目,该项目具有以下内容:

class Project(models.Model):
    name = models.CharField(max_length=100, unique=True)
    dir  = models.CharField(max_length=300, blank=True, unique=True )

    def __unicode__(self):
        return self.name;

class ASClass(models.Model):
    name      = models.CharField(max_length=100)
    project   = models.ForeignKey(Project, default=1)

    def __unicode__(self):
        return self.name;

class Entry(models.Model):
    project     = models.ForeignKey(Project, default=1)
    asclasses   = models.ManyToManyField(ASClass)

以下是问题:

是否有办法在不覆盖模型的保存功能的情况下,使条目只允许具有相同项目ID的类?

*************** ************开始编辑************************************ **********************
要明确,我不反对压倒拯救。在这种情况下,我实际上已经覆盖它以提供上面未列出的属性。我已经知道如何通过简单地扩展覆盖来回答这个问题,所以简单地说,“你可以覆盖保存”将没有用。

我想知道是否有更好的方法来实现这一点,如果有一个Django本机实现,并且密钥类型已经存在。

*************** ************结束编辑************************************ ***********************

有没有办法在Postgresql中执行此操作?

(好的方法,这里是在Postgresql中创建表的代码) 这创建了以下表格:

CREATE TABLE blog_asclass
(
  id serial NOT NULL,
  "name" character varying(100) NOT NULL,
  project_id integer NOT NULL,
  CONSTRAINT blog_asclass_pkey PRIMARY KEY (id),
  CONSTRAINT blog_asclass_project_id_fkey FOREIGN KEY (project_id)
      REFERENCES blog_project (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)

CREATE TABLE blog_entry
(
  id serial NOT NULL,
  project_id integer NOT NULL,
  build_date timestamp with time zone NOT NULL,
  CONSTRAINT blog_entry_pkey PRIMARY KEY (id),
  CONSTRAINT blog_entry_project_id_fkey FOREIGN KEY (project_id)
      REFERENCES blog_project (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)

CREATE TABLE blog_entry_asclasses
(
  id serial NOT NULL,
  entry_id integer NOT NULL,
  asclass_id integer NOT NULL,
  CONSTRAINT blog_entry_asclasses_pkey PRIMARY KEY (id),
  CONSTRAINT blog_entry_asclasses_asclass_id_fkey FOREIGN KEY (asclass_id)
      REFERENCES blog_asclass (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
  CONSTRAINT blog_entry_asclasses_entry_id_fkey FOREIGN KEY (entry_id)
      REFERENCES blog_entry (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
  CONSTRAINT blog_entry_asclasses_entry_id_key UNIQUE (entry_id, asclass_id)
)

CREATE TABLE blog_project
(
  id serial NOT NULL,
  "name" character varying(100) NOT NULL,
  dir character varying(300) NOT NULL,
  CONSTRAINT blog_project_pkey PRIMARY KEY (id),
  CONSTRAINT blog_project_dir_key UNIQUE (dir),
  CONSTRAINT blog_project_name_key UNIQUE (name)
)

2 个答案:

答案 0 :(得分:2)

您可以使用pre_save信号,如果它们不匹配则引发错误...效果类似于覆盖保存(在保存之前调用它)

问题是创建/删除/更新多对多关系不会触发保存(或相应的pre_savepost_save

更新

尝试使用through argument on your many-to-many relation

这使您可以手动定义m2m关系的中间表,这将使您可以访问信号以及函数。

然后您可以随意选择信号或超载

答案 1 :(得分:1)

我确信您可以使用trigger在PostgreSQL级别执行此操作,您可以将其添加到Django initial-SQL file,以便在syncdb自动创建。

在Django模型级别,为了获得有用的答案,你必须澄清为什么你反对覆盖save()方法,因为那是目前提供这个的正确(也许是唯一的)方法一种验证。

Django 1.2将(希望)包含full model validation framework