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)