【问题标题】:django Model.objects.create not immediately assign primary key to variable how to access that?django Model.objects.create 不会立即将主键分配给变量如何访问?
【发布时间】: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 字段吗?我假设您一开始没有在模型上声明该字段,后来添加了它(也没有运行 makemigrationsmigrate)否则我不知道您是如何没有得到错误.
  • 您没有为 id 分配任何东西,它只是一个主键。如果您期望自动增量,请使用 AutoField 而不是 IntegerField。我也很困惑它是如何显示查询集的。
  • @AbdulAzizBarkat 不,我后来没有添加它,而且我一开始也做过迁移。
  • @Summer 你说得对,谢谢。
  • 我建议您删除模型中的手动字段id = ...。然后 Django 会自动生成一个名为 id 的字段,它是自动增量设置为 True 的主键。

标签: python django django-models


【解决方案1】:

您需要 save() 对象以便分配 pk。另外,您可以参考官方文档:https://docs.djangoproject.com/en/3.2/ref/models/instances/#auto-incrementing-primary-keys

【讨论】:

猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
相关资源
最近更新 更多