Мой сайт имеет двух типов пользователей; клиентов и поставщиков. Я в конечном итоге со следующей структурой класса:Повторное использование набора полей модели в Django
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)
Я вижу две простые решения, чтобы повторно использовать информацию об адресе: либо обратитесь к Адрес через ForeignKey из профиля & классов клиентов, или наследовать Профиль & классы клиентов от адреса.
я могу увидеть некоторые плюсы для обоих подходов:
ForeignKey
- группы адресные данные хорошо за одно поле вместо «чистых» модель
- нет риска множественного наследования в будущем
Наследование
- более легкий доступ к полям
- меньше база данных присоединяется
- адреса автоматически видны с объектом в админ Джанго
Какой бы вы и почему? Считаете ли вы, что любое из решений по своей сути плохое? Вы видите несколько лучших альтернатив?
С административным аспектом я был в основном – anttikoo
Дух, все еще изучая этот материал ... :-) Итак: Хорошие моменты! С аспектом администрирования я был в основном обеспокоен представлением на уровне объекта. Там было бы приятно видеть, что данные адреса раздуты, а не переполнены одной строкой.Я предполагаю, что это может быть достигнуто с помощью InlineModelAdmin, но все же это не так чисто, как с наследованием. – anttikoo
Вы всегда можете добавить части адреса в виде столбцов в своем администраторе. добавьте 'address.zipcode' в' list_display' вашего администратора. –