Django custom unique together constraint
You probably could solve this with postgresql's indexes on expressions
but here is another way:
class Share( models.Model ): sharer = models.ForeignKey(User) receiver = models.ForeignKey(User), related_name='receiver') key = models.CharField(max_length=64, unique=True) def save(self, *args, **kwargs): self.key = "{}.{}".format(*sorted([self.sharer_id, self.receiver_id])) super(Share, self).save(*args, **kwargs)
But it obviously wouldn't work if you change values with QuerySet.update
method. You also could look at django-denorm, it solves this with triggers.