Django多对多关系添加不起作用

时间:2015-12-01 20:36:30

标签: 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)

我希望能够为我的课程分配要求,所以为了做到这一点,我尝试以下方法:我得到一个课程,课程,已经保存或我刚刚保存,我运行以下内容: / p>

c = Course.objects.get(title="STACK 100")
req = Requirement.objects.get(name="XYZ")
c.requirements.add(req)

当我通过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)

编辑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

根据我的调试器,manager是类型规划器(我的项目名称).Course.None。

1 个答案:

答案 0 :(得分:0)

我认为您需要在c.requirements.add(curr_req)之后调用c.save()