2012-03-07 2 views
1

Новое для программирования, и это очень сбивает меня с толку ... У меня есть 2 модели. Департамент и Кроссфункциональный проект. Связь между двумя моделями создает таблицу соединений, называемую Department_Crossfunctionalproject.DJANGO: отношения «многие ко многим» с дополнительными полями

У меня есть другая модель, называемая сотрудником. Я хочу добавить сотрудников в таблицу Department_Crossfunctional. Как я могу это сделать?

Я следую этому руководству: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships. Не могу ли я сделать это в автоматически созданной таблице соединений раздела department_crossfunctionalproject, которую создает DJANGO?

я получаю следующее сообщение об ошибке:

CommandError("One or more models did not validate:\n%s" % error_text) 
django.core.management.base.CommandError: One or more models did not validate: 
companydatabase.membership:"Department_crossfunctionalproject" has a relationship with model <class 'companydatabase.models.Department_crossfunctionalproject'>, 
which has either not been installed or is abstract. 

МОДЕЛИ:

class Crossfunctionalproject(models.Model): 
    nameofproject = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.nameofproject 

class Department(models.Model): 
    name = models.CharField(max_length=100) 
    project = models.ManyToManyField(Crossfunctionalproject, null=True, blank=True) 

class Employee(models.Model): 
    employeenumber = models.CharField(max_length=50) 
    fname = models.CharField(max_length=50, verbose_name='First Name') 
    mname = models.CharField(max_length=50, null=True, blank=True, verbose_name='Middle Name') 
    lname = models.CharField(max_length=50, verbose_name='Last Name') 
    email = models.EmailField(null=True, blank=True, verbose_name='Email') 
    phone = models.CharField(max_length=50, null=True, blank=True, verbose_name='Phone') 
    title = models.CharField(max_length=50, null=True, blank=True, verbose_name='Position') 

# db table created by DJANGO, I wrote out the model, trying to add extra columns* 
class Department_crossfunctionalproject(models.Model): 
    department = models.ForeignKey(Department) 
    crossfunctionalproject = models.ForeignKey(Crossfunctonalproject) 
    membership = models.ManyToManyField(Employee, through="Membership") 

class Membership(models.Model): 
    employee = models.ForeignKey(Employee) 
    department_crossfunctionalproject = models.ForeignKey(Department_crossfunctionalproject)  
    whytheyjoined = models.CharField(max_length=100) 
+0

У вас есть ошибка в 'Employee.title.verbose_name' -> missing' '' в конце. –

+0

спасибо, что была ошибка при копировании кода здесь – thedeepfield

ответ

0

Проблема заключается в том, что вы определяете Department_Crossfunctionalproject прежде, чем 'Сотрудник'. Попробуйте с предоставлением имя Employee модели в виде строки:

membership = models.ManyToManyField('Employee', through="Membership") 
+0

Я переместил модель сотрудника выше department_crossfunctionalproject, а также попробовал сотрудника как строку, но все же я не могу заставить работать на сервере. Все еще получаю ту же команду ошибки в оболочке. – thedeepfield

+0

Не забудьте обновить базу данных. Если вы не используете что-то вроде юга, тогда вам нужно будет удалить таблицы в этом приложении и «python manage.py syncdb' –

+0

Я пытаюсь восстановить базу данных, но когда я запускаю python manage.py syncdb, я получаю ошибки, говорящие : Ошибка: одна или несколько моделей не подтвердили: companydb.membership: 'department_crossfunctionalproject' имеет отношение к модели , которая либо не была установлена, либо является абстрактной. – thedeepfield

0

команда SyncDB создает таблицы базы данных для всех приложений в INSTALLED_APPS, чьи таблицы не были уже созданы. Он никогда не выдает утверждения ALTER TABLE, чтобы соответствовать изменениям, внесенным в класс модели после установки. Если вы изменили модель Department_Crossfunctionalproject вручную, вам нужно сбросить таблицу и снова запустить syncdb.

syncdb in django manual

+0

поэтому я не запустил команду python manage.py syncdb для создания таблиц, я сделал это вручную. Но я отказался от метода department_crossfunctionalproject, чтобы попробовать его syncdb вместе с таблицей членства, и я получаю сообщение об ошибке: одна или несколько моделей не проверяли: companydb.membership: 'department_crossfunctionalproject' имеет отношение к модели , который либо не был установлен, либо является абстрактным. – thedeepfield

+0

Еще несколько опечаток. Децентрализованному проекту Department_Crossfunctional не хватает двоеточия в строке объявления класса. Элемент Part_Crossfunctionalproject в членстве в классе не может быть в верхнем регистре. – Martin

+0

спасибо, исправил их. Это были ошибки, возникшие при копировании кода. – thedeepfield

0

Мне нравится управлять изменениями в мою модель с помощью Юга: http://south.aeracode.org/

Джанго не обрабатывают сбрасывают столбцы, так что я начал использовать его для этого.

0

У меня есть аналогичное сообщение об ошибке, но причина моей проблемы была иной, и поэтому исправление было другим. Моя проблема заключалась в том, что файлы, содержащие определения каждого класса, не «импортировали» другой класс.

я получил следующее сообщение об ошибке:

Unhandled exception in thread started by bound method Command.inner_run of django.contrib.staticfiles.management.commands.runserver.Command object at 0x010E2170

File "C:\ ...\lib\site-packages\django\core\management\base.py", line 284, in validate

raise CommandError("One or more models did not validate:\n%s" % error_text)

django.core.management.base.CommandError: One or more models did not validate: app_name.studio: 'instructors' has an m2m relation with model Instructor, which has either not been installed or is abstract.

У меня есть отношения ManyToMany определенных между студией и классами инструкторов. Каждый класс определяется в отдельном файле в каталоге моделей (не в том же файле models.py)

В app_name/модели/studio.py:

class Studio(models.Model): 
    instructors = models.ManyToManyField("Instructor", blank=True, null=True, db_table="app_name_instructor_studios") 

В app_name/модели/инструктор .py:

class Instructor(models.Model): 
    studios = models.ManyToManyField("Studio", blank=True, null=True, db_table="app_name_instructor_studios") 

РЕШЕНИЕ:

Я добавил отсутствующий оператор импорта для app_name/models/__ init.py__ файл, как описано in this post

from instructor import * 

Другой способ, что я был в состоянии решить это явно импортировать класс инструктора в app_name/модели/studio.py файл (Тем не менее, я предпочитаю решение Firsts):

from app_name.models.instructor import Instructor 
Смежные вопросы