<p>我在这里解释几个选项,也许其中一个或一个组合对你有用。在</p>
<h3>重写<code>save</code></h3>
<p>您的约束是业务规则,您可以重写<code>save</code>方法以保持数据一致:</p>
<pre class="lang-py prettyprint-override"><code>
class GroupedModels(models.Model):
# ...
def clean(self):
if (self.other_model_one.pk == self.other_model_two.pk):
raise ValidationError({'other_model_one':'Some message'})
if (self.other_model_one.pk < self.other_model_two.pk):
#switching models
self.other_model_one, self.other_model_two = self.other_model_two, self.other_model_one
# ...
def save(self, *args, **kwargs):
self.clean()
super(GroupedModels, self).save(*args, **kwargs)
</code></pre>
<h3>变更设计</h3>
<p>我放了一个简单易懂的样品。假设这个场景:</p>
^{pr2}$
<p>现在,你想避免一个队和自己比赛,而a队只能和B队打一次(几乎是你的规则)。您可以将模型重新设计为:</p>
<pre class="lang-py prettyprint-override"><code>class BasketballMatch(models.Model):
HOME = 'H'
GUEST = 'G'
ROLES = [
(HOME, 'Home'),
(GUEST, 'Guest'),
]
match_id = models.IntegerField()
role = models.CharField(max_length=1, choices=ROLES)
player = models.ForeignKey('app.other_model')
class Meta:
unique_together = [ ( 'match_id', 'role', ) ,
( 'match_id', 'player',) , ]
</code></pre>
<h3><code>ManyToManyField.symmetrical</code></h3>
<p>这看起来像是一个<a href="https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ManyToManyField.symmetrical" rel="noreferrer">symetrical</a>问题,django可以为您处理。与其创建<code>GroupedModels</code>模型,只需在<code>OtherModel</code>上创建一个ManyToManyField字段:</p>
<pre class="lang-py prettyprint-override"><code>from django.db import models
class OtherModel(models.Model):
...
grouped_models = models.ManyToManyField("self")
</code></pre>
<p>这就是django为这些场景内置的。在</p>