在ManyToMany中没有工作.add()函数Python3 Django的关系

时间:2017-02-19 08:21:23

标签: python django

现在我正在使用Django中的ManyToManyField设计数据建模。

我想让每个会议都有各种各样的工具,

  

即)

     

A有低音。

     

B有鼓。

所以,我测试了下一个代码

from django.test import TestCase
from Session.models import Instrument
from Applicants.models import MyUser
from Session.models import Session

class InstTest(TestCase):
    def setUp(self):
        i1 = Instrument.objects.create(name='bass')
        i1.save()
        i2 = Instrument.objects.create(name='guitar')
        i2.save()
        i3 = Instrument.objects.create(name='drum')
        i3.save()

        u1 = MyUser.objects.create(email='a@gmail.com', nickname='A')
        u1.save()
        u2 = MyUser.objects.create(email='b@gmail.com', nickname='B')
        u2.save()

        s1 = Session.objects.create(players=u1)
        s1.save()
        s1.instruments.add(i1)

        s2 = Session.objects.create(players=u2)
        s2.save()
        s2.instruments.create(name='drum')

    def test_example(self):
        bass = Instrument.objects.get(name='bass')
        guitar = Instrument.objects.get(name='guitar')
        user = MyUser.objects.get(nickname='A')
        session = Session.objects.get(players=user)
        self.assertEqual('bass', bass.name)
        self.assertEqual('A', session.players.nickname)

        # My problem is in this line
        self.assertEqual('bass', session.instruments.name)

这是Pycharm的结果

/home/user/vEnv/bin/python /home/user/pycharm-2016.3.2/helpers/pydev/pydevd.py --multiproc --qt-support --client 127.0.0.1 --port 40507 --file /home/user/pycharm-2016.3.2/helpers/pycharm/django_test_manage.py test BandMaker.tests.InstTest.test_example /home/user/PycharmProjects/Project
Testing started at --:-- PM ...
warning: Debugger speedups using cython not found. Run '"/home/user/vEnv/bin/python" "/home/user/pycharm-2016.3.2/helpers/pydev/setup_cython.py" build_ext --inplace' to build.
pydev debugger: process 4984 is connecting

Connected to pydev debugger (build 163.10154.50)
Creating test database for alias 'default'...

Failure
Traceback (most recent call last):
  File "/home/user/PycharmProjects/project/BandMaker/tests.py", line 31, in test_example
    self.assertEqual('bass', player.instruments.name)
AssertionError: 'bass' != None

Destroying test database for alias 'default'...

Process finished with exit code 1

我尝试以s1.instruments.create(name='bass')等其他方式进行测试,但我只能看到'bass' != None

我不明白为什么s1.instruments.add(i1)无效。 所以我需要谁帮助我。

而且,这是其他模型类。

/Session/models.py

from django.db import models
from Applicants.models import MyUser

# Create your models here.
class Session(models.Model):
    players = models.ForeignKey(
        MyUser,
        verbose_name='own user info',
        related_name='%(app_label)s_%(class)s_related'
    )

    instruments = models.ManyToManyField(
        'Session.Instrument',
        verbose_name='Session Instrument List',
        related_name='%(app_label)s_%(class)s_instruments'
    )

class Instrument(models.Model):
    name = models.CharField(max_length=50, verbose_name='instrument name')

自定义用户类

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)

class MyUserManager(BaseUserManager):
    def create_user(self, email, nickname, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
            nickname=nickname,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, nickname, password):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        user = self.create_user(
            email=email,
            password=password,
            nickname=nickname,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email',
        max_length=255,
        unique=True,
    )
    nickname = models.CharField(
        verbose_name='nickname',
        max_length=50,
        blank=False,
        unique=False,
        default='unknown'
    )
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'    # When username is required, You must use this field!
    REQUIRED_FIELDS = ['nickname']

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

1 个答案:

答案 0 :(得分:2)

问题在于您测试会话是否包含该工具的方式:

self.assertEqual('bass', session.instruments.name)

session.instruments没有属性名称,它是一个ManyToMany对象。

我认为这个测试应该有效:

self.assertEqual('bass', session.instruments.all()[0].name)