Django Model.objects.create не сразу присваивает первичный ключ переменной, как это сделать?

У меня есть модель django Student, как показано ниже

class Student(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)
    score = models.DecimalField(max_digits=10, decimal_places=2)

    def __str__(self):
        return f"Student(id: {self.id}, name: {self.name}, salary: {self.score})"

Я создал несколько пользователей в базе данных и ниже приведен django shell вывод

>>> s = Student.objects.create(name="erik", score=90)
>>> print(s)
Student(id: None, name: erik, salary: 90)   # <----- here is showing id None
>>> Student.objects.all()                                                                                                       
<QuerySet [<Student: Student(id: 1, name: alex, salary: 40.00)>, <Student: Student(id: 2, name: john, salary: 60.00)>, <Student: Student(id: 3, name: erik, salary: 90.00)>]>

когда я вызываю Student.objects.all(), он показывает id.

Я хочу получить id из переменной s, потому что я выполняю модульное тестирование, как показано ниже.

class GetSingleStudentTest(TestCase):

    def setUp(self):
        Student.objects.create(name="student1", score=50)
        Student.objects.create(name="student2", score=55)
        Student.objects.create(name="student3", score=80)
        Student.objects.create(name="student4", score=36)

    def test_get_single_student(self):
        # get API response
        response = client.get(reverse("student-detail", kwargs={"pk" : self.student2.pk }))

        # get data from db
        student = Student.objects.get(pk=self.student2.pk)
        serializer = StudentSerializer(student)
        self.assertEqual(response.data, serializer.data)

Когда я попытался получить доступ к self.student2.pk, получилось None, как мы видели и в django shell. Как я могу получить это id?

Поскольку, как я знаю, Model.objects.create создает пользователя и также сохраняет в базе данных, тогда почему id здесь None? Я учусь по этому руководству https://realpython.com/test-driven-development-of-a-django-restful-api/, но они не показали такого рода проблемы, поэтому я и спросил здесь. Я также использовал метод setUpTestData, но проблема того же рода.

Спасибо.

Вам необходимо save() объект так, чтобы pk был присвоен. Также вы можете обратиться к официальной документации по адресу: https://docs.djangoproject.com/en/3.2/ref/models/instances/#auto-incrementing-primary-keys

Вернуться на верх