【发布时间】:2021-11-13 02:24:22
【问题描述】:
我有如下的 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。
我想从s 变量中获取id,因为我正在执行如下所示的单元测试。
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 方法,但存在同样的问题。
我认为AutoField 运行良好。是否与IntegerField 相同,但我指定了primary_key=True。
谢谢。
【问题讨论】:
-
您后来添加了
id字段吗?我假设您一开始没有在模型上声明该字段,后来添加了它(也没有运行makemigrations和migrate)否则我不知道您是如何没有得到错误. -
您没有为 id 分配任何东西,它只是一个主键。如果您期望自动增量,请使用
AutoField而不是 IntegerField。我也很困惑它是如何显示查询集的。 -
@AbdulAzizBarkat 不,我后来没有添加它,而且我一开始也做过迁移。
-
@Summer 你说得对,谢谢。
-
我建议您删除模型中的手动字段
id = ...。然后 Django 会自动生成一个名为id的字段,它是自动增量设置为 True 的主键。
标签: python django django-models