我在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
?
答案 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")