DJANGO: отношения многие ко многим с дополнительными полями - PullRequest
1 голос
/ 08 марта 2012

Впервые в программировании, и это меня очень смущает ... У меня есть 2 модели.Кафедра и кроссфункциональный проект.Связь между двумя моделями создает таблицу соединений с именем Department_Crossfunctionalproject.

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

Я следовал этому уроку: 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)

Ответы [ 4 ]

0 голосов
/ 25 ноября 2013

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

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

Необработанное исключение в потоке, запущенном связанным методом Command.inner_run объекта django.contrib.staticfiles.management.commands.runserver.Command по адресу 0x010E2170

Файл "C: \ ... \ lib \ site-packages \ django \ core \ management \ base.py", строка 284, в проверке

повышение CommandError («Одна или несколько моделей не прошли проверку: \ n% s»% error_text)

django.core.management.base.CommandError: Одна или несколько моделей не прошли проверку: app_name.studio: у «instructors» есть отношение m2m с моделью Instructor, которая либо не установлена, либо является абстрактной.

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

В app_name / models / studio.py:

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

В app_name / models / instructor.py:

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

РЕШЕНИЕ:

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

from instructor import *

Еще один способ, который мне удалось решить - это явный импорт класса Instructor в app_name / models / studio.py (однако я предпочитаю самое первое решение):

from app_name.models.instructor import Instructor
0 голосов
/ 08 марта 2012

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

syncdb в руководстве по django

0 голосов
/ 11 апреля 2012

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

Django не обрабатывает отбрасываемые столбцы, поэтому я начал использовать его для этого.

0 голосов
/ 08 марта 2012

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

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