DJANGO:与其他领域的多对多关系

时间:2012-03-07 21:50:45

标签: django join many-to-many field relationship

编程新手,这对我来说非常困惑......我有2个型号。部门和跨职能项目。两个模型之间的关系创建一个名为Department_Crossfunctionalproject的连接表。

我有另一个名为employee的模型。我想将员工添加到Department_Crossfunctionalproject表中。我怎样才能做到这一点?

我一直在关注本教程:https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships。我不能在DJANGO创建的自动创建的department_crossfunctionalproject连接表上执行此操作吗?

我一直收到以下错误:

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 :(得分:0)

问题是您在'员工'之前定义Department_Crossfunctionalproject。尝试将Employee模型的名称作为字符串提供:

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

答案 1 :(得分:0)

Syncdb命令为INSTALLED_APPS中尚未创建表的所有应用程序创建数据库表。它永远不会发出ALTER TABLE语句来匹配安装后对模型类所做的更改。 如果您手动更改了Department_Crossfunctionalproject模型,则必须删除该表并再次运行syncdb。

syncdb in django manual

答案 2 :(得分:0)

我喜欢使用South管理我的模型的更改:http://south.aeracode.org/

Django不处理删除列,所以我开始使用它。

答案 3 :(得分:0)

我收到类似的错误消息,但我的问题的原因是不同的,因此修复也不同。 我的问题是,包含每个类定义的文件没有“导入”其他类

我收到以下错误:

  

线程中未处理的异常由django.contrib.staticfiles.management.commands.runserver.Command对象的绑定方法Command.inner_run启动,位于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的关系,该讲师没有安装或是抽象的。

我在Studio和Instructor类之间定义了ManyToMany关系。每个类都在models目录中的单独文件中定义(不在相同的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")

解决方案:

我按照in this post所述 app_name / models / __ init.py __ 文件添加了缺少的导入语句

from instructor import *

我能够解决的另一种方法是在 app_name / models / studio.py 文件中明确导入Instructor类(但我更喜欢第一种解决方案):

from app_name.models.instructor import Instructor