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', )