如何向django中的现有对象添加多对多对象
我有几个简单的课程:访客、学生和访客 访问模型如下所示:如何向django中的现有对象添加多对多对象,django,django-forms,many-to-many,django-testing,Django,Django Forms,Many To Many,Django Testing,我有几个简单的课程:访客、学生和访客 访问模型如下所示: class Visit(models.Model): visitor = models.ForeignKey(Visitor, on_delete=models.PROTECT) students = models.ManyToManyField(Student, blank=True) check_in = models.DateTimeField(auto_now_add=True) check_out
class Visit(models.Model):
visitor = models.ForeignKey(Visitor, on_delete=models.PROTECT)
students = models.ManyToManyField(Student, blank=True)
check_in = models.DateTimeField(auto_now_add=True)
check_out = models.DateTimeField(null=True, blank=True)
def __str__(self):
return "%s : %s" % (self.visitor, self.students)
class Student(models.Model):
visitors = models.ManyToManyField(Visitor, blank=True)
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
def __str__(self):
return "%s, %s" % (self.last_name, self.first_name)
class Visitor(models.Model):
TYPE_CHOICES = (
('P', 'Parent'),
('O', 'Other Parent'),
)
type = models.CharField(choices=TYPE_CHOICES, max_length=1)
first_name = models.CharField(max_length=40, validators=[alphaonly])
last_name = models.CharField(max_length=40, validators=[alphaonly])
birth_date = models.DateField(null=True, blank=True)
def __str__(self):
return "%s, %s" % (self.last_name, self.first_name)
出于测试目的-我正在尝试测试访问的创建
class VisitModelTest(TestCase):
"""Test class for the Visit model"""
def create_visit(self):
visitor = Visitor.objects.create(type='P', first_name='Test', last_name='McTest', birth_date=date(1981, 10, 16))
student = visitor.student_set.create(first_name='Tester', last_name='McJrTest')
visit = visitor.visit_set.create(visitor=visitor)
visit.students.add(student)
return visit
def test_visit_creation(self):
visit = self.create_visit()
self.visitor = mixer.blend(Visitor, type='P', first_name='Test', last_name='McTest', birth_date=date(1981, 10, 16))
self.students = self.visitor.student_set.create(first_name='Tester', last_name='McJrTest')
self.assertTrue(isinstance(visit, Visit))
self.assertEqual(visit.__str__(), "%s : %s" % (self.visitor, self.students))
在我调用的行中,visit.students.add(student)
没有发生任何事情
我的断言因以下错误而失败:
self.assertEqual(visit.__str__(), "%s : %s" % (self.visitor, self.students))
AssertionError: 'McTest, Test : visitor_check_in.Student.None' !=
'McTest, Test : McJrTest, Tester'
- McTest, Test : visitor_check_in.Student.None
+ McTest, Test : McJrTest, Tester
将学生添加到该访问实例的适当方式是什么?首先创建学生和访问对象,然后将其添加到访问者:
student = Student.objects.create(first_name='Tester', last_name='McJrTester')
visit = Visit.objects.create(visitor=visitor)
并添加学生
visit.students.add(student)
希望有帮助。简单地说visit.student.add(student)…没有's',如果我这样做,我会得到错误属性error:'visit'没有属性'student'
,因为如果你看模型,属性是students
(带's')。即使我这样做了,它仍然会显示为断言错误:'McTest,测试:访客登记。学生。无’!='McTest,Test:McJrTest,Tester'