How to enforce different values in multiple ForeignKey fields for Django
This cannot be done through pure Django. There's a ticket for adding CHECK
constraints: https://code.djangoproject.com/ticket/11964
To ensure the situation where team_home == team_visitors
never happens, you will need to add a custom constraint to the table which is database dependent. As an example, in MySQL and PostgresQL:
alter table myapp_match add constraint match_teams_not_equal check (team_home_id <> team_visitors_id);
This will cause the database to raise an integrity error when a save happens. Note that there are also databases where you cannot implement such a constraint.
You can partially ensure that team_home != team_visitors
by overriding the save
method:
class Match(models.Model):
....
def save(self, *args, **kwargs):
if self.team_home == self.team_visitors:
raise Exception('attempted to create a match object where team_home == team_visitors')
super(Match, self).save(*args, **kwargs)
However, someone can modify the database directly, or use update
queryset in Django and you can still end up with Match
objects where team_home == team_visitor
.
You can use this CheckConstraint in class Meta of your django model:
class Meta:
constraints = [
models.CheckConstraint(
check=~Q(team_home=F('team_visitors')),
name='team_home_and_team_visitors_can_not_be_equal')
]