创建由多对多字段组成的模型实例
Posted
技术标签:
【中文标题】创建由多对多字段组成的模型实例【英文标题】: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 所以这个想法是学生可以拥有许多模块。
【参考方案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:
# …
【讨论】:
非常感谢!以上是关于创建由多对多字段组成的模型实例的主要内容,如果未能解决你的问题,请参考以下文章