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