2010-10-14 1 views
1

Мой сайт имеет двух типов пользователей; клиентов и поставщиков. Я в конечном итоге со следующей структурой класса:Повторное использование набора полей модели в 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

  • группы адресные данные хорошо за одно поле вместо «чистых» модель
  • нет риска множественного наследования в будущем

Наследование

  • более легкий доступ к полям
  • меньше база данных присоединяется
  • адреса автоматически видны с объектом в админ Джанго

Какой бы вы и почему? Считаете ли вы, что любое из решений по своей сути плохое? Вы видите несколько лучших альтернатив?

ответ

1

Я бы, вероятно, поступил с использованием подхода Foreign Key - я думаю, что он чище.

Работа с «профи» наследования вы перечисляете:

  1. Это легко для доступа к полям принадлежности к объекту, иностранные шпоночному - my_customer.address.zipcode не слишком сложен, не так ли?
  2. Сомневаюсь, что вы найдете непозволительно дорогостоящие соединения, и если вы это сделаете, вы всегда сможете избежать их при получении множества клиентов/поставщиков.
  3. Вы всегда можете отобразить адреса наряду с объектом в администратора Django, если вы определяете метод __unicode__() на Address, и просто добавить address (если это то, что вы называете ForeignKey свойства Customer) к вашему админу list_display.
+0

С административным аспектом я был в основном – anttikoo

+0

Дух, все еще изучая этот материал ... :-) Итак: Хорошие моменты! С аспектом администрирования я был в основном обеспокоен представлением на уровне объекта. Там было бы приятно видеть, что данные адреса раздуты, а не переполнены одной строкой.Я предполагаю, что это может быть достигнуто с помощью InlineModelAdmin, но все же это не так чисто, как с наследованием. – anttikoo

+0

Вы всегда можете добавить части адреса в виде столбцов в своем администраторе. добавьте 'address.zipcode' в' list_display' вашего администратора. –

 Смежные вопросы

  • Нет связанных вопросов^_^