I'm trying to use a ManyToMany relationship and it is giving me the following error:

NameError: name 'ManyToManyField' is not defined

Background: Building a to do app where users have (many) projects, projects have (many) lists of tasks and projects have (many) tags that characterise them.

Here is my models.py, any help catching the error would be greatly appreciated.

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)
有帮助吗?

解决方案

In List, you are referring to ManyToManyField without referencing it via models as you do with all the other fields.

Note that the error message would have told you exactly where the problem was, so that you wouldn't have needed to post all the other irrelevant code.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top