【问题标题】:django override delete cascade for one timedjango覆盖删除级联一次
【发布时间】:2018-11-08 09:35:22
【问题描述】:

是否有确保模型实例没有任何相关对象的选项? 即,如果 Person 对象有任何相关对象,我想要这一行

person.delete()

引发错误。

而且我不想为每个外键修改on_delete=models.CASCADE。我只在这里需要这种保护,对于我的应用程序中的任何其他情况(如 django 管理站点),我更喜欢级联行为。

【问题讨论】:

  • 您是否尝试从您的模型中覆盖删除方法?在这个方法中检查你的 fk 和其他人并调用 super(...).delete() 来删除你的模型
  • 我没有覆盖删除方法

标签: python django django-models django-queryset


【解决方案1】:

这符合你想要的吗?

has_related = False
for field in person.__class__._meta.get_fields():
    if field.is_relation:
        field_name = field.get_accessor_name()
        model_field = getattr(person, field_name)
        if not isinstance(model_field, models.Model) and model_field.all():
            has_related = True
            break

if not has_related:
    person.delete()

【讨论】:

  • 谢谢,为什么要对字段对象使用 get_cache_name()?我收到一个 AttributeError
  • 我用get_accessor_name()而不是get_cache_name()更新了我的帖子。我们使用这种方法来获取相关字段的XXX_set(或者如果修改)名称。你从哪里得到你的 AttributeError ?
猜你喜欢
  • 2010-09-12
  • 2011-01-29
  • 2018-07-27
  • 1970-01-01
  • 2011-04-20
  • 2021-06-27
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多