Skip to main content
 首页 » 编程设计

python之当可能有多个关系时,如何在 django 中强制只建立一个关系

2024年11月01日33xiaohuochai

我正在创建一个网络应用程序来管理我们地区的机器人团队。在应用程序中,我有一个如下所示的 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) 

本质上,我希望它与 team 或与 member 有关系,但不能两者都有。有没有办法强制执行此操作?

请您参考如下方法:

我只能看到两个可行的解决方案。 First 实际上与评论中建议的@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') 

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

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

第二种方法是保持模型不变,手动进入数据库后端并添加一个数据库常量。例如在 postgres 中:

ALTER TABLE foo ADD CONSTRAINT bar CHECK ...; 

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