如何在Django的多个ForeignKey字段中强制执行不同的值

时间:2016-01-30 00:43:06

标签: python sql django django-models

我在Django中有以下模型:

from django.db import models

class Team(models.Model):
    name = models.CharField(max_length=200)


class Match(models.Model):                                                      
    team_home = models.ForeignKey(Team)                                                      
    team_visitors = models.ForeignKey(Team)                                                       
    league = models.CharField(max_length=200)                                                      
    date_played = models.DateField()  

这个想法是能够有一个匹配的'有两支队伍参加某场比赛的对象。一支球队自己打球真是太奇怪了。如何保证team_home不等于team_visitors

3 个答案:

答案 0 :(得分:5)

这不能通过纯Django来完成。有一个添加<?php session_start(); // should be at the top of your php if (isset($_POST['var'])) { $_SESSION['var'] = $_POST['var']; } $myvar = isset($_SESSION['var']) ? $_SESSION['var'] : "no var"; echo $myvar; 约束的凭单:https://code.djangoproject.com/ticket/11964

为了确保CHECK永远不会发生的情况,您需要向依赖于数据库的表添加自定义约束。例如,在MySQL和PostgresQL中:

team_home == team_visitors

这将导致数据库在发生保存时引发完整性错误。请注意,还有一些数据库无法实现此类约束。

您可以通过覆盖alter table myapp_match add constraint match_teams_not_equal check (team_home_id <> team_visitors_id); 方法部分确保team_home != team_visitors

save

但是,有人可以直接修改数据库,或者在Django中使用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) queryset,您仍然可以使用update的{​​{1}}个对象。

答案 1 :(得分:4)

您可以在Django模型的Meta类中使用此CheckConstraint:

class Meta:
    constraints = [
        models.CheckConstraint(check=~Q(team_home=F('team_visitors')), name='team_home_and_team_visitors_can_not_be_equal')
    ]

答案 2 :(得分:-1)

我相信你可以使用Meta类的unique_together属性:unique_together

class Match(models.Model):
    ...
    class Meta:
        unique_together = ("team_home", "team_visitors")