2014-11-28 5 views
0

У меня есть класс Person, класс Project и класс Contract. Один проект ведет к контракту, в котором люди наняты. Теперь я хочу класс с людьми, связанных с их контрактами, поэтому я создать еще один класс, ContractStaff для того, чтобы реализовать через отношения:Django через отношения

class Person(models.Model): 
    name = CharField 
    adress = CharField 
    #contract_staff is a list of all the Contracts a single Person object has 
    contract_staff = ManyToManyField(Contract, through = 'ContractStaff') 

class ContractStaff(models.Model): 
    person = ForeignKeyField(Person) 

class Contract(models.Model): 
    id_ref = IntegerField 
    starting_date = DateField 
    ending_date = DateField 
    contract_staff = ForeignKey(ContractStaff) 
    project = OneToOneField(Project) 

class Project(models.Model): 
    title = CharField 
    id_ref = IntegerField 
      ... 

Дело в том, что я видел в других примерах, что это промежуточный класс который имеет два FK, в моем примере есть класс Contract, который имеет один из них, связывающий два других класса. Поскольку ContractStaff может иметь много контрактов, а один контракт имеет только один контрактный контракт, я думаю, что поле FK должно идти в классе контракта. Я ошибаюсь? Правильно ли эта модель?

+1

Я не думаю, что это имеет смысл, но трудно сказать, потому что непонятно, что такое классы. Что такое штат сотрудников? Это сотрудник? Аналогично, что такое экземпляр ContractStaff? И что на самом деле обозначают отношения «многие ко многим»? –

+0

Я редактировал, я надеюсь, что это яснее. – loar

+1

Не совсем. Зачем вам контракт ContractStaff? ForeignKey может перейти прямо из Контракта в Личность, и в этом случае 'person.contract_set.all()' будет списком всех контрактов, которые имеет один человек. –

ответ

2

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

Например, если вы хотите сделать так, чтобы одно лицо могло быть связано с несколькими Контрактами и чтобы Контракты могли быть подключены к нескольким Лицам, тогда вам нужен многотоновый экран. Он будет реализован с одной строкой в ​​сквозной таблице на соединение между человеком и контрактом, поэтому каждое соединение будет иметь ровно 1 человека и 1 контракт, следовательно, два внешних ключа.

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

Что вы имеете, это не ManyToManyField.

Редактировать: в частности, если у Контракта может быть один Контрактный стол, а у Контрактного штаба может быть одно Лицо, тогда существует множество отношений от Контракта до Контракта с персоналом, а не с ManyToMany.

+0

Я добавляю больше информации, чтобы быть более четким. – loar

+0

Я видел, следовательно, редактирование. Дело в том, что у вас есть отношения не ко многим. – RemcoGerlich

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