Django Viele zu Viele Beziehung hinzufügen funktioniert nicht
Ich verwende das ManyToManyField von Django für eines meiner Modelle.
class Requirement(models.Model):
name = models.CharField(max_length=200)
class Course(models.Model):
requirements = models.ManyToManyField(Requirement)
Ich möchte Anforderungen für meine Klassen zuweisen können. Dazu versuche ich Folgendes: Ich erhalte eine Klasse, einen Kurs, der bereits gespeichert ist oder den ich gerade gespeichert habe, und führe Folgendes aus:
c = Course.objects.get(title="STACK 100")
req = Requirement.objects.get(name="XYZ")
c.requirements.add(req)
Während dies funktioniert, wenn ich es über die Django manage.py-Shell mache, funktioniert es nicht, wenn ich es programmgesteuert in einem Skript mache. Ich arbeite mit anderen Modellen in diesem Skript und das alles funktioniert gut. Und ich weiß sogar, dass es den aktuellen Kurs und die Anforderung erfolgreich abruft, wenn ich beide überprüfe. Ich kann nicht herausfinden, was das Problem ist!
BEARBEITEN
Was ich damit meine, nicht zu arbeiten, ist, dass das Anforderungsfeld des Kurses leer bleibt. Wenn ich zum Beispiel c.requirements.all () tue, erhalte ich eine leere Liste. Wenn ich diesen Ansatz jedoch über die Shell durchführe, wird die Liste ausgefüllt. Das Skript ist ein Crawler, der BeautifulSoup zum Crawlen einer Website verwendet. Ich versuche, den Kursen Anforderungen in der folgenden Funktion hinzuzufügen:
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:
Nachdem ich in die Funktion eingetreten bin, habe ich Folgendes gefunden:
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
Und laut meinem Debugger ist der Manager vom Typ Planer (mein Projektname) .Course.None.