Option 1
Définissez le champ ForeignKey
null sinon nécessaire. Peut valider cela dans la méthode clean()
.
class A(models.Model):
# ...
pass
class B(models.Model):
# ...
pass
class C(models.Model):
# ...
fkA = models.ForeignKey(A, null=True) # to null if not needed
fkB = models.ForeignKey(B, null=True) # to null if not needed
# ...
def clean(self):
# only one fk allowed
if self.fkA and self.fkB:
raise ValidationError("Relation either to A or to B - not both!")
# one fk required
if not self.fkA and not self.fkB:
raise ValidationError("Relation to A or to B required!")
Option 2
travail avec l'héritage modèle
class A(models.Model):
# ...
pass
class B(models.Model):
# ...
pass
class AbstractC(models.Model):
# ...
class Meta:
# ...
abstract = True
class CtoA(AbstractC)
# ...
fkA = models.ForeignKey(A)
# ...
class CtoB(AbstractC)
# ...
fkB = models.ForeignKey(B)
# ...
migration de base de données:
$ python manage.py makemigrations
$ python manage.py migrate