【问题标题】:Create model instance consisting of many-to-many field创建由多对多字段组成的模型实例
【发布时间】:2021-12-28 21:13:15
【问题描述】:

我正在尝试使用发布请求创建模型实例,但是我遇到的一个问题是模型包含一个多对多的字段。现在我处于一个阶段,我有一个由模型实例(模块)的主键组成的数组,我希望与我尝试创建的模型(学生)相关联。

请看我下面的代码,因为我不知道我哪里出错了,经过一些基础研究后看来我需要使用.set() 方法。

PUT['modules'] 对应于由值 [1,2,3,5] 组成的 array

def create_student(request):
    """API for creating a student"""
    if request.method == "POST":
        PUT = json.loads(request.body)
        student = Student(name=PUT['name'], join_date=PUT['join_date'], academic_year=PUT['academic_year'],
                          modules=PUT['modules'] # THIS IS WHERE I NEED HELP
                          )
        student.save()
        return JsonResponse(student.to_dict())

    return HttpResponseBadRequest("Invalid method")

感谢您的宝贵时间。

【问题讨论】:

  • PUT['modules'] 是一个列表吗?什么清单?主键?
  • @WillemVanOnsem 你好,是的模型(模块)的主键列表我正在尝试与我正在创建的模型(学生)相关联。感谢您的宝贵时间。
  • @WillemVanOnsem 所以这个想法是学生可以拥有许多模块。

标签: python django ajax post model


【解决方案1】:

为了填充ManyToManyField 关系,首先需要保存要链接的两个项目。这是必要的,因为否则它们没有主键:通过在 联结表 中添加一条记录与要链接的两个主键来链接两个项目。

因此,如果您想将您正在构建的Student 与模块链接,您首先创建student,然后您可以使用student.modules.add(…) 通过解压缩列表将其链接到(现有)模块模块的主键:

def create_student(request):
    """API for creating a student"""
    if request.method == "POST":
        PUT = json.loads(request.body)
        student = Student.objects.create(
            name=PUT['name'], join_date=PUT['join_date'], academic_year=PUT['academic_year']
        )
        student.modules.add(*PUT['modules'])
        return JsonResponse(student.to_dict())
    else:
        # …

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2020-08-13
  • 2011-10-23
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多