Django метод model_set.add () не работает, но ошибок нет - PullRequest
1 голос
/ 17 июня 2020

Итак, я работаю над веб-сайтом на основе 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

РЕДАКТИРОВАТЬ: Я не видел этого в первый раз, но если это относится к вопросу и кому-то достаточно умному, чтобы знать, что это «Ложь "в строковом выводе выше есть объяснение. Второй оператор печати:

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

Есть идеи, что я делаю неправильно? Заранее спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

После нескольких часов поиска в (неправильной части) документации для Django я наконец понял, что я не делал никакой распаковки кортежей в следующей строке:

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

Вы можете запутаться и сказать: «Ммм .. Я этого не видел?». Это совершенно нормально - я был идиотом и подумал: «Здесь не может быть ошибки». Это оказалось неверным, поскольку утверждение:

studentClass.student_set.add(student)

пытается добавить кортеж вместо объекта Student.

Вместо этого я просто изменил строку на распаковать кортеж на месте:

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

И, наконец, go вперед и добавить StudentClass к объекту Student:

studentClass.student_set.add(student)

Иногда забавно, как вы предполагаете, что что-то не так ваш код, и вы понимаете, что это была ваша собственная глупая ошибка ...: P Спасибо всем, кто потрудился проверить и подумал над ответом :)

...