Django独特(与外键)

我有一种情况,我想使用unique_together的Meta选项来执行一个特定的规则,这里是中介模型:

 class UserProfileExtension(models.Model): extension = models.ForeignKey(Extension, unique=False) userprofile = models.ForeignKey(UserProfile, unique=False) user = models.ForeignKey(User, unique=False) class Meta: unique_together = (("userprofile", "extension"), ("user", "extension"), # How can I enforce UserProfile's Client # and Extension to be unique? This obviously # doesn't work, but is this idea possible without # creating another FK in my intermediary model ("userprofile__client", "extension")) 

这里是UserProfile:

 class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) client = models.ForeignKey(Client) 

谢谢。

你不能。

unique_together子句直接转换为SQL唯一索引。 而且你只能在单个表格的列上设置,而不是几个表格的组合。

您可以自己添加validation,但只需覆盖validate_unique方法并将其添加到该validation即可。

文档: http : //docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.validate_unique

我的解决scheme是使用Django的get_or_create 。 通过使用get_or_create,如果行已经存在于数据库中,则会发生无用的get,如果该行不存在,则会创build该行。

例:

 extension = Extension.objects.get(pk=someExtensionPK) 
userProfile = UserProfile.objects.get(pk=someUserProfilePK)
UserProfileExtension.objects.get_or_create(extension=extension, userprofile=userProfile)