2

我正在创建一个 Web 应用程序来管理我们所在地区的机器人团队。在应用程序中,我有一个 django 模型,如下所示:

class TeamFormNote(models.Model):   
    team = models.ForeignKey(Team, blank=True, null=True)
    member = models.ForeignKey(TeamMember, blank=True, null=True)
    notes = models.TextField()
    def __unicode__(self):
        if self.team:
            return "Team Form Record: " + unicode(self.team)
        if self.member:
            return "Member Form Record: " + unicode(self.member)

本质上,我希望它与团队或成员有关系,但不能两者兼而有之。有没有办法强制执行?

4

2 回答 2

2

我只能看到两个可行的解决方案。首先实际上与评论中建议的@mariodev 相同,即使用遗传外键。这看起来像:

# make sure to change the app name
ALLOWED_RELATIONSHIPS = models.Q(app_label = 'app_name', model = 'team') | models.Q(app_label = 'app_name', model = 'teammember')
class TeamFormNote(models.Model):
    content_type = models.ForeignKey(ContentType, limit_choices_to=ALLOWED_RELATIONSHIPS)
    relation_id = models.PositiveIntegerField()
    relation = generic.GenericForeignKey('content_type', 'relation_id')

它的作用是设置一个通用外键,允许您链接到项目中的任何其他模型。由于它可以链接到任何其他模型,因此要将其限制为仅您需要的模型,我limit_choices_to使用ForeignKey. 这将解决您的问题,因为只有一个通用外键,因此无法创建多个关系。缺点是您不能轻松地将连接应用于通用外键,因此您将无法执行以下操作:

Team.objects.filter(teamformnote_set__notes__contains='foo')

第二种方法是保留模型并手动进入数据库后端并添加 db 约束。例如在 postgres 中:

ALTER TABLE foo ADD CONSTRAINT bar CHECK ...;

这将起作用,但它不会对您的代码透明。

于 2013-09-22T02:17:12.270 回答
0

这听起来像是引擎盖下的格式错误的对象模型......定义所有常见元素和两个派生类的抽象类怎么样,一个用于团队,一个用于成员?如果您因为希望在同一个表中引用两者而遇到问题,则可以使用Generic Relations

于 2013-09-22T13:16:58.243 回答