代码之家  ›  专栏  ›  技术社区  ›  cwallenpoole

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

  •  0
  • cwallenpoole  · 技术社区  · 15 年前

    请原谅,代码太多了,但我不确定是否可以用其他方式解释我的问题

    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)
    

    是否有一种方法,在不重写模型的save函数的情况下,使条目只允许具有相同项目ID的类?


    明确地说,我并不反对覆盖save。事实上,我已经在本案中否决了它,以提供上面未列出的财产。我已经知道如何通过简单地扩展覆盖来回答这个问题,所以简单地说“您可以覆盖保存”是没有帮助的。

    我想知道是否有更好的方法来实现这一点,是否有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 回复  |  直到 15 年前
        1
  •  2
  •   Jiaaro    15 年前

    你可以使用 pre_save 如果它们不匹配,则发出信号并引发错误。。。其效果类似于覆盖save(它在save之前被调用)

    问题在于,创建/删除/更新多对多关系不会触发保存(或随后触发) post_save )

    through argument on your many-to-many relation

    这样,您就可以手动定义m2m关系的中间表,从而访问信号和函数。

    然后,你可以选择信号或过载,你喜欢

        2
  •  1
  •   Carl Meyer    15 年前

    trigger ,您可以将其添加到 Django initial-SQL file 所以它是在syncdb自动创建的。

    在Django模型级别,为了得到有用的答案,您必须澄清为什么反对重写save()方法,因为这是目前提供此类验证的正确(可能也是唯一)方法。

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