У моего сайта есть два типа пользователей; клиентов и поставщиков. Я получил следующую структуру класса:
class Customer(models.Model):
# stuff specific to customers
class Supplier(models.Model):
# stuff specific to suppliers
class Profile(models.Model): # returned by Django's User.get_profile()
user = models.ForeignKey(User, unique=True)
customer = models.OneToOneField(Customer, null=True, unique=True)
supplier = models.OneToOneField(Supplier, null=True, unique=True)
Теперь мне нужно добавить несколько адресов к этим моделям:
- и клиенты, и поставщики должны иметь свой «пользовательский» адрес, поэтому он должен быть в профиле.
- у клиентов также есть адрес для выставления счетов, который должен быть в клиенте, тогда
Адрес будет примерно таким:
class Address(models.Model):
street1 = models.CharField(max_length=100)
street2 = models.CharField(max_length=100)
zipcode = models.CharField(max_length=16)
city = models.CharField(max_length=100)
state = models.CharField(max_length=100)
country = models.CharField(max_length=100)
Я вижу два простых решения для повторного использования адресной информации: либо обратиться к Address через ForeignKey из классов Profile & Customer, либо наследовать классы Profile & Customer из Address.
Я вижу некоторые плюсы для обоих подходов:
Иностранный ключ
- хорошо группирует адресные данные за одним полем вместо того, чтобы «загрязнять» модель
- отсутствие риска множественного наследования в будущем
Наследование
- более легкий доступ к полям
- меньше соединений с базой данных
- адреса автоматически отображаются с объектом в админке Django
С кем бы вы пошли и почему? Считаете ли вы, что какое-либо из решений по своей сути плохо? Вы видите лучшие альтернативы?