请原谅过多的代码,但我不确定我是否可以解释我的问题
我正在处理一个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)
)
答案 0 :(得分:2)
您可以使用pre_save
信号,如果它们不匹配则引发错误...效果类似于覆盖保存(在保存之前调用它)
问题是创建/删除/更新多对多关系不会触发保存(或相应的pre_save
或post_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。