2016-08-14 3 views
0

Доброе утро, извините, мой английский, потому что я использую Google Translate.Value Object Django

Я начинаю с Python и Django, и у меня возникает вопрос о создании моих моделей. Я хотел бы создать что-то вроде:

Person (models.Model)

  • Имя
  • ...
  • Адрес

Адрес (models.Model)

  • PublicPlace
  • Район
  • ...

То есть, адрес в качестве отдельного ValueObject для того, чтобы использовать более чем одну модель. В полях базы данных в классе адресов будет сохраняться таблица «Люди» и другие объекты, которые могут возникнуть («Предприятие», «Клиент», «Любой, у кого есть адрес»). Поэтому избегайте дублирования всех полей адресов для каждой требуемой модели.

Я видел, что это нужно сделать, установив адрес класса Meta для абстрактного и наследуя остальные. Но если я хочу сделать больше ValueObjects, для этого нужно унаследовать несколько классов, я задаюсь вопросом, есть ли более правильный путь.

спасибо.

+0

Почему вы хотите сохранить поля внутри Person и т. Д., Вместо того, чтобы иметь адрес как конкретную модель и использовать отношения? –

+0

Это отношение 1..1 в данном конкретном случае планировало оставить одну и ту же таблицу. Эти классы используются только в качестве примера, может быть другим ValueObject. Я обычно работаю с .NET и DDD и хочу знать, как применить это в Django ... –

ответ

1

Вы хотите что-то вроде:

class Person(models.Model): 
    LastName = models.CharField(max_length=30) 
    FirstName = models.CharField(max_length=30) 
    ... 
    address = models.ManyToManyField(Address) 

В этом много, один человек может иметь несколько адресов, и каждый адрес может быть несколько человек. Если вы хотите разрешить только один адрес на человека, используйте

address = models.ForeignKey(Address) 

Это по-прежнему позволяет нескольким людям на адрес.

+0

Я хотел бы рассматривать функцию класса только как структуру данных, а не как сущность. Если бы это был объект, для этого примера было бы отношение 1..1. Я хотел бы знать, как писать ValueObjects (концепция архитектуры «DDD»). Другим примером может быть, если я определяю один класс Contact, который всегда имеет поля «Телефон», «Мобильный» и «Электронная почта», так же как и Pessoa.Contato.Telefone. Не обязательно записывать в другую таблицу. –