NameError:未定义 'ManyToManyField

-1 投票
1 回答
1716 浏览
提问于 2025-04-17 21:46

我正在尝试使用多对多关系,但遇到了以下错误:

NameError: name 'ManyToManyField' is not defined

背景:我正在构建一个待办事项应用,用户可以有多个项目,每个项目可以有多个任务列表,并且项目还可以有多个标签来描述它们。

这是我的 models.py 文件,如果能帮我找出错误,我将非常感激。

from django.db import models
from django.contrib.auth.models import User

#Not sure if I need the ID's. They may be superfluous. Ask in the lab today.


#Used to list collaborators on projects and track friends lists
#Borrowed from http://stackoverflow.com/a/1113039/1254402
class SeparatedValuesField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        self.token = kwargs.pop('token', ',')
        super(SeparatedValuesField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if not value: return
        if isinstance(value, list):
            return value
        return value.split(self.token)

    def get_db_prep_value(self, value):
        if not value: return
        assert (isinstance(value, list) or isinstance(value, tuple))
        return self.token.join([unicode(s) for s in value])

    def value_to_string(self, obj):
        value = self._get_val_from_obj(obj)

class UserProfile(models.Model):
    user_id = models.CharField(max_length=100, null=True, blank=True, unique=True)
    user = models.OneToOneField(User)
    # The additional attributes we wish to include.
    first_name = models.CharField(max_length=64)
    surname = models.CharField(max_length=64)
    friends = SeparatedValuesField()
    picture = models.ImageField(upload_to='profile_images', blank=True)
    projects = models.ManyToManyField('Project')
    # This line is required. Links UserProfile to a User model instance.
    # Override the __unicode__() method to return out something meaningful!
    def __unicode__(self):
        return self.user.username

#Project model.
#Attributes = name, website, team members
#Many users can have many projects
class Project(models.Model):
    project_id = models.CharField(max_length=100, null=True, blank=True, unique=True)
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=300)
    website = models.URLField(blank=True)
    team_members = SeparatedValuesField()

class List(models.Model):
    #Many lists belong to one project
    project = models.ForeignKey(Project)
    tasks = ManyToManyField('Task')
    name = models.CharField(max_length=128)
    colour = models.CharField(max_length=10)

#NOTE! - Abstracting the tags (category, progress and priority) to project level.
class Task(models.Model):
    #Many tasks belong to one list
    belong_to_list = models.ForeignKey(List)

    #Unique id for task
    task_id = models.CharField(max_length=100, null=True, blank=True, unique=True)

    #Standard title & description
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=300)

#NOTE! - Abstracting the tags (category, progress and priority) to project level.
class Tag(models.Model):
    project = models.ForeignKey(Project)
    #UUID
    task_id = models.CharField(max_length=100, null=True, blank=True, unique=True)

    #User assigns each tag a colour. hex code.
    colour = models.CharField(max_length=10)

1 个回答

3

List里,你提到的ManyToManyField没有像其他字段那样通过models来引用。

注意,错误信息其实会告诉你问题出在哪里,所以你不需要发那么多不相关的代码。

撰写回答