上記の答えが「なぜそれが衝突するのか」という質問に答えることを私は知っています、そしてそれが古い質問であることを私は知っています。しかし、コードが一方の列のエントリをもう一方の列のエントリに基づいて制限する方法を考え出そうとして、私はそれに遭遇しました。十分な答えは見つかりませんでしたが、なんとか自分でパズルを解くことができました。以下は、直接尋ねられないが、他の人に役立つかもしれない質問への答えです。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255)
class Family(models.Model):
mum = models.OneToOneField(Person, on_delete=models.SET_NULL, related_name='family_as_mum', null=True)
dad = models.OneToOneField(Person, on_delete=models.SET_NULL, related_name='family_as_dad', null=True)
def save(self, *args, **kwargs):
if Family.objects.filter(mum=self.dad).exists() or Family.objects.filter(dad=self.mum).exists() or self.mum == self.dad:
return #any person can only be a mum or a dad, not both
else:
super(Family, self).save(*args, **kwargs)
def update(self, *args, **kwargs):
if Family.objects.filter(mum=self.dad).exists() or Family.objects.filter(dad=self.mum).exists() or self.mum == self.dad:
return #same as save, don't want them to update a family member in an invalid way
else:
super(Family, self).update(*args, **kwargs)
@staticmethod
def get_family(person):
if Family.objects.get(mum=person).exists():
return Family.objects.get(mum=person)
elif Family.objects.get(dad=person).exists():
return Family.objects.get(dad=person)
else:
return None
*注:ここで@staticmethodを見つけました。人が母親か父親かが事前にわからない可能性があるため、親に関連付けられた家族を検索する関数があると便利だと考えました。