我正在创建一个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)
基本上,我希望它与团队建立关系或与成员建立关系,但不是两者兼而有之。有没有办法强制执行此操作?
答案 0 :(得分:2)
我只能看到两个可行的解决方案。首先实际上与注释中建议使用Genetic外键的@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
的{{1}}参数。这将解决您的问题,因为只有一个通用外键,因此无法创建多个关系。缺点是您无法轻松地将连接应用于通用外键,因此您将无法执行以下操作:
ForeignKey
第二种方法是将模型保留为原样并手动进入数据库后端并添加db constaint。例如在postgres中:
Team.objects.filter(teamformnote_set__notes__contains='foo')
这将有效,但它对您的代码不透明。
答案 1 :(得分:0)
这听起来像是一个糟糕的物体模型...... 如何定义所有公共元素和两个dreived类的抽象类,一个用于团队,一个用于成员? 如果您遇到此问题,因为您希望在同一个表中同时引用它们,则可以使用Generic Relations。