O Django entre muitos e muitos relacionamentos não está funcionando
Estou usando o ManyToManyField do Django para um dos meus modelos.
class Requirement(models.Model):
name = models.CharField(max_length=200)
class Course(models.Model):
requirements = models.ManyToManyField(Requirement)
Quero poder atribuir requisitos para minhas aulas, para fazer isso, tente o seguinte: Recebo uma aula, curso, que já está salvo ou que acabei de salvar e executei o seguinte:
c = Course.objects.get(title="STACK 100")
req = Requirement.objects.get(name="XYZ")
c.requirements.add(req)
Enquanto isso funciona quando eu faço através do shell do Django manage.py, não funciona quando eu faço por meio de programação em um script. Eu trabalho com outros modelos nesse script e tudo funciona bem. E eu sei que ele recupera com êxito o curso atual e os requisitos, enquanto verifico os dois. Não consigo descobrir qual é o problema!
EDITAR:
O que quero dizer com não trabalhar é que, o campo de requisitos do curso permanece vazio. Por exemplo, se eu fizer c.requirements.all (), receberei uma lista vazia. No entanto, se eu fizer essa abordagem através do shell, a lista será preenchida. O script é um rastreador que usa o BeautifulSoup para rastrear um site. Tento adicionar requisitos a cursos na seguinte função:
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)
EDIT 2:
Depois de entrar na função, foi o que descobri:
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
E, de acordo com o meu depurador, o gerente é do tipo planejador (o nome do meu projeto).