【问题标题】:Django model_set.add() method doesn't work but no errorsDjango model_set.add() 方法不起作用但没有错误
【发布时间】:2020-06-17 02:43:19
【问题描述】:

所以,我正在开发一个基于 Django 的网站 (Django 3),我正在尝试使用文件将某些元素添加到数据库中。虽然读取文件及其数据工作顺利,脚本似乎突然停止在这一行:

studentClass.student_set.add(student)

就在此之前,我已经毫无问题地执行了这样的行:

school = get_object_or_404(School, pk=form.cleaned_data['school'].pk)
        studentClass, created = StudentClass.objects.get_or_create(
            school=school,
            name=form.cleaned_data['name'],
            grade=form.cleaned_data['grade']
        )
.
.
.
print("\nSUCCESS!\n")
print("\nAttempting to add {} to {}".format(
                    student,
                    studentClass))
studentClass.student_set.add(student) <---- SUSPECTED CULPRIT!
print("SUCCESS!")

打印语句到控制台的输出:

Attempting to add (<Student: 1 - Jessica>, False) to 1 - HenMei

编辑:我第一次没有看到这个,但如果它与问题有关,并且有足够聪明的人知道上面字符串输出中的“False”是什么,我们将不胜感激。 第二条打印语句:

print("SUCCESS!") 

没有被执行,所以我很确定

studentClass.student_set.add(student)

是造成一些麻烦的行。由于我是初学者,我很可能错了。 编辑:为了确保我做事的方式不是问题的一部分,我还尝试将上面的行重写为:

student.studentClass.add(studentClass)

但同样的事情发生了;该行之后也没有输出。

模型定义如下:

class StudentClass(models.Model):
    school = models.ForeignKey(School, on_delete=models.SET_NULL, null=True)
    name = models.CharField(max_length=25)
    grade = models.PositiveSmallIntegerField(default=1)

    class Meta:
        ordering = ['grade', 'name']

    def __str__(self):
        return "{} - {}".format(self.grade, self.name)

class Student(models.Model):
    studentClass = models.ManyToManyField(StudentClass)
    student_number = models.PositiveSmallIntegerField()
    first_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, default='Female')

    class Meta:
        ordering = [F('student_number').asc(nulls_last=True)]

    def __str__(self):
        return "{} - {}".format(self.student_number, self.first_name)

最后但同样重要的是,这是打印到控制台的最后一行:

[16/Jun/2020 18:14:06] "POST /teachadmin/addStudentClass/ HTTP/1.1" 302 0

这并没有告诉我很多,但我想也许你们那里的专业人士可能需要它:P

任何想法我做错了什么? 提前致谢!

【问题讨论】:

  • 为了清楚起见 - 我检查了数据库并确认此脚本没有添加其他学生。代码突然停止运行。
  • 这很奇怪。你在哪里运行你的 Django 应用程序?在某些环境(如 docker)中,由于缓冲,打印并不总是立即显示。
  • 我仍在我自己的环境中本地运行该项目。但是由于我打算添加到数据库的对象没有正确添加,我想说它是否打印似乎不是真正的问题,而是我使用的临时调试费用;)跨度>
  • 显然应该是“调试工具”>

标签: python-3.x django django-models django-views


【解决方案1】:

在搜索 Django 的(错误部分)文档几个小时后,我终于意识到我没有在以下行中进行任何 元组解包

student = Student.objects.get_or_create(
                    student_number=row.Index,
                    first_name=row.Name,
                    gender=row.Gender
                )

您可能会感到困惑并说“嗯..我没看到这个?”。这是完全正常的——我是个白痴,并认为“那里不可能有错误”。 这被证明是错误的陈述:

studentClass.student_set.add(student)

尝试添加 tuple 而不是 Student 对象。

相反,我将这一行改为简单地在现场进行元组拆包:

student, created = Student.objects.get_or_create(
                    student_number=row.Index,
                    first_name=row.Name,
                    gender=row.Gender
                )

然后最后继续将 StudentClass 添加到 Student 对象:

studentClass.student_set.add(student)

有时你认为你的代码有问题而你意识到这是你自己的愚蠢错误,这很有趣......:P 感谢所有打扰检查并考虑答案的人:)

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多