创建由多对多字段组成的模型实例

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:
        # …

【讨论】:

非常感谢!

以上是关于创建由多对多字段组成的模型实例的主要内容,如果未能解决你的问题,请参考以下文章

多对多表 id 的最佳实践

hibernate 关联关系(多对多对多一对一)的配置

如何以 django 形式过滤多对多字段

复制多对多值

laravel多对多关联模型

ejb3:用简单的主键映射多对多关系