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

2024-09-09 13:10:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个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)

问题是:

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

**********************************************************开始编辑***********************************************************
明确地说,我不反对覆盖save。事实上,在这个案例中,我已经超越了它,提供了一个上面没有列出的财产。我已经知道如何通过简单地扩展覆盖来回答这个问题,所以简单地说“您可以覆盖save”是没有帮助的。在

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

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

用postsql也可以吗?在

(下面是在Postgresql中创建表的代码) 这将创建以下表格:

^{pr2}$

Tags: 项目django代码nameselfprojecttruemodel
2条回答

您可以使用pre_save信号,并在它们不匹配时引发错误。。。其效果类似于重写save(在save之前调用它)

问题是创建/删除/更新多对多关系不会触发save(或导致pre_save或{})

更新

尝试使用^{} argument on your many-to-many relation

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

然后你可以随意选择信号或过载

我确信您可以在PostgreSQL级别使用trigger来完成这项工作,您可以将其添加到Django initial-SQL file中,以便在syncdb中自动创建它。在

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

django1.2将(希望)包含一个full model validation framework。在

相关问题 更多 >