gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:12 25 4
gpt4 key购买 nike

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

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

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

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

ALTER TABLE foo ADD CONSTRAINT bar CHECK ...;

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

关于python - 当可能有多个关系时,如何在 django 中强制只建立一个关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18937920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com