【问题标题】:How to sync a Many to many relationship on Django如何在 Django 上同步多对多关系
【发布时间】:2019-09-18 13:51:02
【问题描述】:

我想知道是否有一个函数可以在 Django ORM 中调用,通过传递一个 ID 数组来更新中间表

我以前使用 Laravel,并且该框架有一个非常有用的方法,称为同步。 sync 方法接受要放置在中间表上的 ID 数组。任何不在给定数组中的 ID 都将从中间表中删除。那么,这个操作完成后,只有给定数组中的 ID 会存在于中间表中,在 Django 中是否有类似的东西?我正在查看文档,但找不到。如果没有,最好的方法是什么?

【问题讨论】:

  • ORM 负责通过 on_delete 参数的 CASCADE 值,您只需将这些 id 作为集合添加到模型中

标签: python django many-to-many relationship


【解决方案1】:

您通常不使用 Django 中的 id,而是使用对象本身。如果您有要设置为多对多关系的对象列表(确保删除旧关系),请使用set()。例如。 publication.articles.set([article1, article2]).

有关如何处理多对多关系的更多示例,请参阅 this page

如果您的表单允许用户选择要选择的对象,使用ModelMultipleChoiceField 将返回表单cleaned_data 中的对象列表,而不是ID。

【讨论】:

  • 我对 Django 处理表单的方式有点新,所以我在 html 上手工制作表单(就像在 Laravel 中一样)l。有没有办法使用 ID 数组获取对象数组?或者如果我需要手动构建数组,可以通过某种方式将对象推入数组
  • Article.objects.filter(id__in=[1, 3, 17]) 会返回一个查询集,您可以将其用作set 方法的参数。
  • 但是即使你手动编写HTML,也最好使用Django Form来处理python中的数据。
  • 我不太明白 Django Froms 是如何工作的。由于时间限制和我对 Laravel 的经验,我手工完成它们我已经熟悉如何做它们。但我有兴趣了解 Django 提供的优势,您能指出正确的方向吗?
  • 最大的优势是将输入数据映射到模型数据(即从字符串输入到python对象),包括验证。这也与一致性有关:在 HTML 中硬编码字段名称意味着您需要确保在视图中将它们命名为相同。阅读this 以获得良好的概述。最后,ModelForms 让更新存储在数据库中的对象变得更加容易。
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2015-01-28
  • 2017-02-02
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多