use*_*999 7 python django django-models django-orm
我正在将 Django 的 ManyToManyField 用于我的模型之一。
class Requirement(models.Model):
name = models.CharField(max_length=200)
class Course(models.Model):
requirements = models.ManyToManyField(Requirement)
Run Code Online (Sandbox Code Playgroud)
我希望能够为我的课程分配要求,因此为此,我尝试执行以下操作:我得到一个已保存或刚刚保存的课程、课程,然后运行以下命令:
c = Course.objects.get(title="STACK 100")
req = Requirement.objects.get(name="XYZ")
c.requirements.add(req)
Run Code Online (Sandbox Code Playgroud)
虽然当我通过 Django manage.py shell 执行此操作时这有效,但当我在脚本中以编程方式执行此操作时,它不起作用。我在这个脚本中与其他模型一起工作,一切正常。我什至知道它成功检索了当前课程和要求,因为我检查了两者。我不知道问题是什么!
编辑:
我所说的不工作是指,课程的要求字段仍然是空的。例如,如果我执行 c.requirements.all(),我将得到一个空列表。但是,如果我通过 shell 执行此方法,则会填充该列表。该脚本是一个使用 BeautifulSoup 爬行网站的爬虫。我尝试在以下功能中添加课程要求:
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)
Run Code Online (Sandbox Code Playgroud)
编辑2:
进入该函数后,我发现了以下内容:
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
Run Code Online (Sandbox Code Playgroud)
根据我的调试器,管理器的类型为 planner(我的项目名称).Course.None。
| 归档时间: |
|
| 查看次数: |
3462 次 |
| 最近记录: |