Вы можете обойти эту проблему, упростив вашу схему, включив в нее одну таблицу Client
с флагом, указывающим тип клиента, вместо двух отдельных моделей.
from django.db import models
from django.utils.translation import ugettext_lazy as _
class Client(models.Model):
PERSON, CORPORATION = range(2)
CLIENT_TYPES = (
(PERSON, _('Person')),
(CORPORATION, _('Corporation')),
)
type = models.PositiveIntegerField(choices=CLIENT_TYPES, default=PERSON)
city = models.CharField(max_length=16)
first_name = models.CharField(max_length=16, blank=True, null=True)
last_name = models.CharField(max_length=16, blank=True, null=True)
corporate_name = models.CharField(max_length=16, blank=True, null=True)
tax_no = models.PositiveIntegerField(blank=True, null=True)
def save(self, *args, **kwargs):
"""
Does some validation ensuring that the person specific fields are
filled in when self.type == self.PERSON, and corporation specific
fields are filled in when self.type == self.CORPORATION ...
"""
# conditional save logic goes here
super(Client, self).save(*args, **kwargs)
Если вы поступите таким образом, вам вообще не придется возиться с Generic Foreign Keys. В качестве дополнительного удобства вы также можете написать собственные менеджеры для модели клиента, такие как Client.corporate.all()
, Client.person.all()
, для возврата предварительно отфильтрованных наборов запросов, содержащих только тот тип клиентов, который вам нужен.
Это также может быть не лучшим способом решения вашей проблемы. Я просто выбрасываю это как одну потенциальную возможность. Я не знаю, существует ли общепринятая идея объединить две одинаковые модели и использовать переопределение сохранения для обеспечения целостности данных. Кажется, что это может быть потенциально проблематично ... Я позволю сообществу узнать меня об этом.