Supongamos que tengo una relación como abajo:

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)

¿Cómo debo agregar / establecer un valor al 'estudiante' o 'maestro' de campo? Intenté asignar un objeto de los modelos relacionados, pero obtuve un error :

Se prohíbe la asignación directa de al lado delantero de un conjunto de muchos a muchos. Use Student.set () en su lugar.

Y probé esto también:

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

Entonces recibo: ValueError: No se puede agregar "& lt; estudiante: sarah@gmail.com>": la instancia está en la base de datos "Ninguno", el valor está en la base de datos "predeterminado"

Hice esto también:

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

Entiendo esto: django.db.utils.programmingError: columna "meeting_id" es de tipo BIGINT, pero la expresión es de tipo UUID Línea 1: ..._ Reunión "(" Meeting_ID "," Student_ID ") valores ('C7688DF9 -... ^ Sugerencia: necesitará reescribir o lanzar la expresión.

0
The Mir 8 jun. 2021 a las 21:12

2 respuestas

La mejor respuesta

Creas un Meeting y que lo rellene con Teacher s y Student s, SO:

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)

Para obtener más información, consulte el < em> relaciones de muchos a muchos de la sección de la documentación.

Sobre la base de la excepción que compartió en la pregunta, creó el modelo Meeting antes de realizó las teclas primarias de tipo UUIDField. Podemos solucionar este problema por:

  1. Extracción del modelo Meeting;
  2. ejecutar makemigrations;
  3. crear un nuevo modelo Meeting;
  4. ejecutar makemigrations de nuevo; y
  5. Ejecutar migrate para actualizar la base de datos.
2
Willem Van Onsem 8 jun. 2021 a las 18:57

Primero guardar objetos estudiantiles y objetos de profesor.

>> 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 )

Luego, cree un objeto de reunión con los otros campos (excepto M2M). Luego agregue / configura los objetos M2M.

meeting = Meeting.objects.create(**the_model_fields_as_dict)
meeting.student.add(student1, student2)
meeting.teacher.add(teacher )
0
Jisson 8 jun. 2021 a las 18:28