Предположим, у меня есть отношение, показанное ниже:

class Student(AbstractBaseUser):
    # It inherits AbstractBaseUser and has it's own manger
    # note: I did forget to add editable here
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    firstname
    lastname
    ...


class Teacher(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True)
    firstname
    lastname
    email
    ...


class Meeting(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
    student = models.ManyToManyField(Student)
    teacher = models.ManyToManyField(Teacher)

Как мне добавить / установить значение для поля «ученик» или «учитель». Я попытался назначить им объект из связанных моделей, но получил ошибку :

Прямое присвоение передней стороне набора "многие ко многим" запрещено. Вместо этого используйте student.set ().

И я тоже пробовал:

m = Meeting()
s = Student.objects.first() #to get a random student
m.student.add(s)

Тогда я получаю: ValueError: невозможно добавить "": экземпляр находится в базе данных "None", значение указано в базе данных "default"

Я тоже сделал это:

m = Meeting.objects.create() #It does only have two mentioned fields.
m.student.add(s)

Я получаю это: django.db.utils.ProgrammingError: столбец «meeting_id» имеет тип bigint, а выражение - тип uuid СТРОКА 1: ..._ встреча "(" meeting_id "," student_id ") VALUES ('c7688df9 -... ^ ПОДСКАЗКА: вам нужно будет переписать или преобразовать выражение.

0
The Mir 8 Июн 2021 в 21:12

2 ответа

Лучший ответ

Вы создаете Meeting, а затем заполняете его Teacher и Student, так что:

s1 = Student.objects.create(firstname='Foo', last_name='Bar')
s2 = Student.objects.create(firstname='Qux', last_name='Qux')
t1 = Teacher.objects.create(
    firstname='Some',
    last_name='One',
    email='someone@something.com'
)

m = Meeting.objects.create()
m.student.add(s1, s2)
m.teacher.add(t1)

Для получения дополнительной информации см. < em> Отношения "многие-ко-многим" документации.

Основываясь на исключении, которое вы указали в вопросе, вы создали модель Meeting до создания первичных ключей типа UUIDField. Мы можем решить эту проблему следующим образом:

  1. удаление модели Meeting;
  2. запустить makemigrations;
  3. создать новую модель Meeting;
  4. снова запустить makemigrations; а также
  5. запустите migrate, чтобы обновить базу данных.
2
Willem Van Onsem 8 Июн 2021 в 18:57

Сначала сохраните объекты "Ученик" и "Учитель"

>> student_data = {'firstname': 'John', 'last_name', 'Doe', }
>> student1 = Student.objects.create(**student_data )
>>student_data = {'firstname': 'Test', 'last_name', 'Test', }
>> student2 = Student.objects.create(**student_data )

>> teacher_data  = {'firstname': 'TeacherJohn', 'last_name': 'TeacherDoe', 'email': 'john.doe@mail.com'}
>> teacher = Teacher.objects.create(**teacher_data )

Затем создайте объект Встреча с другими полями (кроме m2m). Затем добавьте / установите объекты m2m.

meeting = Meeting.objects.create(**the_model_fields_as_dict)
meeting.student.add(student1, student2)
meeting.teacher.add(teacher )
0
Jisson 8 Июн 2021 в 18:28