保存时,为所有m2m条目更新其他模型中的foreignkey字段

时间:2015-12-07 12:33:25

标签: python django

一个模型(periodiccertification)通过foreignkey链接到另一个模型(assets)。此定期模型还通过foreignkey(空白和null为true)链接,以访问另一个模型(项目条件)的m2m关系(资产)。

db中的相关认证领域:

pc db

项目条件的m2m关系:

m2m pcond

问题是:

保存项目条件时,periodiccertification模型中的所有资产只需要通过一个字段更新:projectconditions_id(foreignkey)。这样就可以过滤与项目条件批次相关的所有资产。

可以通过覆盖save_model()来完成,还是需要不同的信号?因此,我每次提交项目条件时都要完成的工作是:

每个 .projectconditions.assets.asset_id

等于 periodiccertification.asset_id:

更新 processes.periodiccertification.projectconditions_id with projects.projectsconditions_id

有人知道在保存期间执行此操作的pythonic方法(可能是您要保存的资产尚未存在的问题吗?)或某种post_save函数期间?

尝试学习python(初学者级别),但希望下面的尝试进一步证明了它的含义:

def save_model(self, request, obj, form, change):
"""obtain all entries in Periodic Certification Model that has the same asset_id as in m2m"""
certification_asset = PeriodicCertification.objects.get(asset_id=assets.asset_id)
""""save the current projectconditions"""
for asset_id in certification_assets:
        certification_asset.projectconditions_id = obj.id
    obj.save() 

1 个答案:

答案 0 :(得分:0)

您可以使用Django的update函数进行所需的更改。

所以在你的ProjectConditions模型中:

def save(self, *args, **kwargs):
    super(ProjectConditions, self).save(*args, **kwargs)
    PeriodicCertification.objects.filter(asset_id__in=[x.id for x in self.assets]).update(projectconditions_id=self.id)

[x.id for x in self.assets.all()]应该为您提供当前实例的资产ManyToMany与资产的关系中所有asset_id的列表。然后,您仅针对PeriodicCertification与列表中的匹配的实例过滤asset_id模型。最后,您使用updateprojectconditions_id字段设置为当前实例的ID。

我试图弄清楚正确的细节,但如果没有希望它会指出你正确的方向。