Django models.Manager unable to access model

Viewed 62

I have the following test which fails as it only inserts one row into the database where it should be inserting 100 rows

class QuestionsTest(TestCase):
    def setUp(self):
        self.fake = Faker()

    def test_populating_table_with_random_data(self):
        newQuestion = Questions()
        x = 0
        while x < 100:
            newQuestion.category = self.fake.text(max_nb_chars=254)
            newQuestion.difficulty = self.fake.text(max_nb_chars=8)
            newQuestion.question_type = self.fake.text(max_nb_chars=20)
            newQuestion.text = self.fake.text(max_nb_chars=254)
            newQuestion.save()
            x += 1
        #100 rows should be inserted
        self.assertEqual(Questions.objects.count(), (100))


"""Traceback (most recent call last):
  File 'Database/tests.py', line 99, in test_populating_table_with_random_data
    self.assertEqual(Questions.objects.count(), (100))
AssertionError: 1 != 100 """


Prior to receiving this error I was getting the error "Class Questions has no objects member". I got around this by explicitly declaring

objects = models.Manager()

in my Questions model, but I thought that django automatically generated a manager with the name objects

1 Answers

You each time save the same Questions object, so after creating it the first time, you update the existing object. At the end, there is only one.

You can create a new object in the loop:

class QuestionsTest(TestCase):
    def setUp(self):
        self.fake = Faker()

    def test_populating_table_with_random_data(self):
        x = 0
        while x < 100:
            newQuestion = Questions()
            newQuestion.category = self.fake.text(max_nb_chars=254)
            newQuestion.difficulty = self.fake.text(max_nb_chars=8)
            newQuestion.question_type = self.fake.text(max_nb_chars=20)
            newQuestion.text = self.fake.text(max_nb_chars=254)
            newQuestion.save()
            x += 1
        #100 rows should be inserted
        self.assertEqual(100, Questions.objects.count())

It is probably better to use a for loop:

class QuestionsTest(TestCase):
    def setUp(self):
        self.fake = Faker()

    def test_populating_table_with_random_data(self):
        for __ in range(100):
            newQuestion = Questions()
            newQuestion.category = self.fake.text(max_nb_chars=254)
            newQuestion.difficulty = self.fake.text(max_nb_chars=8)
            newQuestion.question_type = self.fake.text(max_nb_chars=20)
            newQuestion.text = self.fake.text(max_nb_chars=254)
            newQuestion.save()
        #100 rows should be inserted
        self.assertEqual(100, Questions.objects.count())

You can also create the object with .objects.create(…):

class QuestionsTest(TestCase):
    def setUp(self):
        self.fake = Faker()

    def test_populating_table_with_random_data(self):
        for __ in range(100):
            newQuestion = Questions.objects.create(
                category = self.fake.text(max_nb_chars=254),
                difficulty = self.fake.text(max_nb_chars=8),
                question_type = self.fake.text(max_nb_chars=20),
                text = self.fake.text(max_nb_chars=254)
            )
        #100 rows should be inserted
        self.assertEqual(100, Questions.objects.count())
Related