Django: Как лучше всего соединить модели для двух типов клиентов (индивидуальные и корпоративные) с адресной моделью? - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над созданием приложения, подобного CRM, с использованием Django, и наткнулся на проблему.Компания, которая будет использовать приложение, имеет частных лиц в качестве клиентов, но также и другие компании.Поскольку они имеют разные поля, я создал две отдельные модели:

class PersonAccount(models.Model):
    first_name = models.CharField(max_length=100, null=False)
    last_name = models.CharField(max_length=100, null=False)
    personal_id_number = models.CharField(max_length=50, unique=True, null=False)
    document_series = models.CharField(max_length=50)
    document_number = models.CharField(max_length=50, null=False)
    document_emission_date = models.DateField(null=True)
    document_expiration_date = models.DateField(null=True)
    birth_date = models.DateField(null=True)
    sex = models.ForeignKey(Sex, on_delete=models.CASCADE, null=False)
    workplace = models.CharField(max_length=100)
    nationality = models.ForeignKey(Geography, on_delete=models.CASCADE)
    occupation = models.CharField(max_length=100)
    observations = models.CharField(max_length=500)
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)
    def __str__(self):
        return "Person account: " + self.last_name + " " + self.first_name  

class CompanyAccount(models.Model):
    company_name = models.CharField(max_length=100, null=False)
    chamber_of_commerce_reg_number = models.CharField(max_length=50, unique=True, null=False)
    company_unique_id_number = models.CharField(max_length=50, unique=True, null=False)
    company_type = models.ForeignKey(CompanyType, on_delete=models.CASCADE)
    company_nationality = models.ForeignKey(Geography, on_delete=models.CASCADE)
    company_activity = models.CharField(max_length=100)
    company_representative = models.ForeignKey(PersonAccount, on_delete=models.CASCADE)
    observations = models.CharField(max_length=500)
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)
    def __str__(self):
        return "Commpany account: " + self.last_name + " " + self.first_name

Я хочу соединить их обе с моделью адреса:

class AccountAddress(models.Model):
    address_type = models.ForeignKey(AddressType, on_delete=models.CASCADE, null=False)
    street = models.CharField(max_length=100)
    street_number = models.CharField(max_length=100)
    buliding = models.CharField(max_length=100)
    entrance = models.CharField(max_length=100)
    floor = models.CharField(max_length=100)
    appartment_number = models.CharField(max_length=100)
    postal_code = models.CharField(max_length=100)
    city = models.CharField(max_length=100, null=False)
    country = models.ForeignKey(Geography, on_delete=models.CASCADE, related_name='account_country')
    province = models.ForeignKey(Geography, on_delete=models.CASCADE, related_name='account_province')
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)
    def __str__(self):
        return  "Account address: " + str(self.account) + " - " + str(self.address_type)

Дело в том, что я довольно новичок в Django иединственное решение, которое я вижу в настоящее время, - это подключить реальную модель адреса к PersonAccount, а затем создать другое для подключения к CompanyAccount.Я уверен, что должен быть другой путь, но, хотя я некоторое время искал и читал, я не могу найти ничего, что соответствовало бы моим потребностям.

Не могли бы вы помочь мне?Спасибо!

1 Ответ

2 голосов
/ 13 марта 2019

Вы можете определить родительский класс Account для CompanyAccount и PersonAccount (что позволяет сохранить некоторый код путем перемещения общих полей в родительский класс) и определить ForeignKey для AccountAddress:

class AccountAddress(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)

Или вы можете определить отношение «многие ко многим» для отдельных моделей учетных записей вместо внешнего ключа в Address:

class CompanyAccount(models.Model):
    addresses = models.ManyToManyField(AccountAddress)

Второе решение позволяет разделять адреса между учетными записями; в первом только один аккаунт связан с одним адресом. Вы можете иметь несколько адресов для каждой учетной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...