python - 当在多对多模型中创建新的目标实例时,更新源模型的每个实例的推荐方法是什么?
问题描述
我有一个网站,我想在其中显示一个基本的 html 表格,如下所示:
Product_Name | Attribute_1 | Attribute_2
-----------------------------------------
Soap | True | True
Shampoo | False | True
所以我创建了类Product
并Attribute
具有多对多关系。
模型.py
class Product(models.Model):
name = models.CharField(max_length=10)
attributes = models.ManyToManyField(on_delete='CASCADE')
class Attribute(models.Model):
name = models.CharField(max_length=1, default='N')
所以我有两个 Attribute 实例——Attribute_1 和 Attribute_2。
当我创建一个新属性 (Attribute_3) 时,有没有办法可以通过指向新属性的链接更新我的所有产品实例的关系?
我知道 Django 为 m2m 关系创建了一个直通表。根据文档,我知道我可以执行以下操作:
for prod_obj in Product.objects.all():
prod_obj.add(new_attribute_object)
但是,如何确保每次创建属性对象时自动/一致地发生这种情况?
解决方案
您应该为您的模型编写一个自定义save
方法Attribute
a) 检查Attribute
对象是否是第一次创建;b)如果是这样,请将其添加Attribute
到数据库中的每个Product
。有关编写自定义save
方法的更多信息,请参阅这篇文章。
推荐阅读
- jar - weblogic wseeclient.jar 在从 weblogic 服务器迁移到 jboss 时,我想要一个用于 JBOSS 的替代 jar
- ruby - 在数组Ruby的第一个元素中创建逗号分隔的字符串
- ios - 键盘卡在 ios 13 模拟器中
- azure-devops - Azure DevOps Api - 获取剩余工作日
- javascript - 编辑表单时来自本地存储的复选框值
- ios - iOS 应用商店 NSBluetoothAlwaysUsageDescription - 拒绝
- javascript - 如何在 GMaps javascript API 中获取从起点到终点的实时持续时间
- flutter - 带有firebaseauthentification的空指针期望
- node.js - 当从节点发送响应到角度时,返回意味着什么
- python - 使用多处理和 exe (pyinstaller) 时,argparse 抛出错误