【问题标题】:How do I delete an object if not referenced by another object如果没有被另一个对象引用,我如何删除一个对象
【发布时间】:2014-08-28 22:53:17
【问题描述】:

我有两个类似的模型:

class ContactDetails(Model):
  name = models.CharField()
  dept = models.CharField()

class Server(Model):
  ip = models.GenericIPAddressField()                           
  hostname = models.CharField()
  contact = models.ForeignKey(ContactDetails)

ContactDetails 对象可能被许多服务器对象引用。

当我删除服务器记录时,我还想删除关联的 ContactDetails 记录。

但前提是没有其他服务器记录引用该 ContactDetails 记录。在 Django 中执行此操作的最佳实践方式是什么?

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    可能使用 pre_delete 或 post_delete signals

    from django.db import models
    from django.dispatch import receiver
    
    @receiver(models.signals.post_delete, sender=Server)
    def delete_contact(sender, instance, **kwargs):
        if not Server.objects.filter(contact=instance.contact):
            instance.contact.delete()
    

    实例是已经从数据库中删除的Server实例。

    【讨论】:

    • 另外,有没有办法查看所有联系人对象并删除任何未被服务器对象引用的对象?非常感谢。
    • 当然 - 每个 ContactDetails 都会有一个反向设置回服务器,可能称为 server_set。如果它是空的,则没有关系。我建议在 Django 文档中阅读所有这些内容。
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 2012-11-25
    • 2018-02-23
    • 2021-03-15
    • 2012-05-06
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多