Django Unique Together (with foreign keys) Django Unique Together (with foreign keys) python python

Django Unique Together (with foreign keys)


You can't.

The unique_together clause is directly translated to the SQL unique index. And you can only set those on columns of a single table, not a combination of several tables.

You can add validation for it yourself though, simply overwrite the validate_unique method and add this validation to it.

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


My solution was to use Django's get_or_create. By using get_or_create, a useless get will occur if the row already exists in the database, and the row will be created if it does not exist.

Example:

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


My 2 cents, complementing the accepted response from @Wolph

You can add validation for it yourself though, simply overwrite the validate_unique method and add this validation to it.

This is a working example code someone could find usefull.

from django.core.exceptions import ValidationErrorclass MyModel(models.Model):    fk = models.ForeignKey(AnotherModel, on_delete=models.CASCADE)    my_field = models.CharField(...)  # whatever    def validate_unique(self, *args, **kwargs):        super().validate_unique(*args, **kwargs)        if self.__class__.objects.\                filter(fk=self.fk, my_field=self.my_field).\                exists():            raise ValidationError(                message='MyModel with this (fk, my_field) already exists.',                code='unique_together',            )