La relación de muchos a muchos de Django no funciona
Estoy usando ManyToManyField de Django para uno de mis modelos.
class Requirement(models.Model):
name = models.CharField(max_length=200)
class Course(models.Model):
requirements = models.ManyToManyField(Requirement)
Quiero poder asignar requisitos para mis clases, así que para hacer eso, intento lo siguiente: obtengo una clase, curso, que ya está guardado o que acabo de guardar, y ejecuto lo siguiente:
c = Course.objects.get(title="STACK 100")
req = Requirement.objects.get(name="XYZ")
c.requirements.add(req)
Si bien esto funciona cuando lo hago a través del shell Django manage.py, no funciona cuando lo hago programáticamente en un script. Trabajo con otros modelos en este script y todo funciona bien. E incluso sé que recupera con éxito el curso actual y el requisito cuando verifico ambos. ¡No puedo entender cuál es el problema!
EDITAR:
Lo que quiero decir con no trabajar es que el campo de requisitos del curso permanece vacío. Por ejemplo, si hago c.requirements.all (), obtendré una lista vacía. Sin embargo, si hago este enfoque a través del shell, la lista se completará. El script es un rastreador que usa BeautifulSoup para rastrear un sitio web. Intento agregar requisitos a los cursos en la siguiente función:
def create_model_object(self, course_dict, req, sem):
semester = Semester.objects.get(season=sem)
#Checks if the course already exists in the database
existing_matches = Course.objects.filter(number=course_dict["number"])
if len(existing_matches) > 0:
existing_course = existing_matches[0]
if sem=="spring":
existing_course.spring = semester
else:
existing_course.fall = semester
existing_course.save()
c = existing_course
#Creates a new Course in the database
else:
if sem == "spring":
new_course = Course(title=course_dict["title"],
spring=semester)
else:
new_course = Course(title=course_dict["title"],
fall=semester)
new_course.save()
c = new_course
curr_req = Requirement.objects.get(name=req)
c.requirements.add(curr_req)
print(c.id)
EDITAR 2:
Después de entrar en la función, esto es lo que encontré:
def __get__(self, instance, instance_type=None):
if instance is None:
return self
rel_model = self.related.related_model
manager = self.related_manager_cls(
model=rel_model,
query_field_name=self.related.field.name,
prefetch_cache_name=self.related.field.related_query_name(),
instance=instance,
symmetrical=False,
source_field_name=self.related.field.m2m_reverse_field_name(),
target_field_name=self.related.field.m2m_field_name(),
reverse=True,
through=self.related.field.rel.through,
)
return manager
Y según mi depurador, el administrador es de tipo planificador (el nombre de mi proyecto) .Curso.Ninguno.