2010-12-14 3 views
47

Я хочу сохранить некоторую дополнительную информацию в том, что было создано автоматически, ManyToMany join-table. Как мне это сделать в Django?Взаимодействие Django ManyToMany с дополнительными полями

В моем случае у меня есть две таблицы: «Сотрудники» и «Проекты». Я хочу хранить то, сколько каждый сотрудник получает за час работы в каждом из проектов, поскольку эти значения не совпадают. Итак, как бы я это сделал?

Что мне пришло в голову, вместо метода «ManyToManyField» создать явно третий класс/таблицу для хранения этих новых сведений и установить его связь с «Сотрудниками» и «Проекты» с использованием метода «ForeignKey» , Я уверен, что это сработает, но лучший ли это подход?

+2

Возможный дубликат [Как добавить столбец в ManyToMany таблице (Джанго)] (http://stackoverflow.com/questions/12567151/how-to-add-column-in-manytomany-table-django) – ravi404

+0

@ravz Почему бы не закрыть это как обман этого? – TylerH

+0

@TylerH это старое сообщение. Однако у обоих вопросов есть ответы, я бы предложил объединить их. – ravi404

ответ

69

Вот пример того, что вы хотите достичь:

http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

В случае ссылки когда-либо ломается:

from django.db import models 

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 
+0

Как я могу получить доступ к параметру date_joined в шаблоне? Group.date_joined не работает. – Timo

+0

Дата присоединения группы не будет работать, потому что сама группа ничего не объединяет. Вместо этого вы можете получить его членов и получить свое время соединения. для члена в группе.members.all(): – gruszczy

+1

Как я могу использовать group.members.add() с указанным выше подходом? – Dejell

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