73

unique_together特定のルールを適用するために のメタ オプションを使用したい状況があります。これが中間モデルです。

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"))

ここにユーザープロファイルがあります:

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

ありがとう。

4

7 に答える 7

87

できません。

unique_together句は一意のインデックスに直接変換されますSQL。また、複数のテーブルの組み合わせではなく、単一のテーブルの列にのみ設定できます。

validate_uniqueただし、メソッドを上書きしてこの検証を追加するだけで、自分で検証を追加できます。

ドキュメント: http://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.validate_unique

于 2010-12-14T14:28:59.297 に答える
12

私の解決策は、Django のget_or_createを使用することでした。get_or_create を使用すると、行がデータベースに既に存在する場合は無駄な get が発生し、存在しない場合は行が作成されます。

例:

 
extension = Extension.objects.get(pk=someExtensionPK)
userProfile = UserProfile.objects.get(pk=someUserProfilePK)
UserProfileExtension.objects.get_or_create(extension=extension, userprofile=userProfile)
于 2012-07-31T20:28:45.513 に答える