【问题标题】:using post_delete signal to delete a StreamItem使用 post_delete 信号删除 StreamItem
【发布时间】:2013-12-26 12:39:31
【问题描述】:

这是我创建的用于创建新闻提要的模型。每当创建模型 Fe 和 Event 的实例时,都会使用 post_save() 信号创建 StreamItem。它一切正常。现在我想删除 StreamItem 的任何实例,只要使用 post_delete() 信号删除 Fe 和 Event 的实例。有可能吗?

class StreamItem(models.Model):
 content_type = models.ForeignKey(ContentType)
 object_id = models.PositiveIntegerField()
 pub_date = models.DateTimeField()
 user = models.ForeignKey(User)

 content_object = generic.GenericForeignKey('content_type', 'object_id')

def get_rendered_html(self):
    template_name = 'streams/stream_item_%s.html' % (self.content_type.name)
    return render_to_string(template_name, { 'object': self.content_object }) 

def create_stream_item(sender, instance, signal, *args, **kwargs):
# Check to see if the object was just created for the first time
 if 'created' in kwargs:
    if kwargs['created']:
        create = True

        # Get the instance's content type
        ctype = ContentType.objects.get_for_model(instance)

        pub_date = instance.pub_date

        if ctype.name == "photo":
            user = instance.album.user
        else:
            user = instance.user

        if create:
            StreamItem.objects.get_or_create(content_type=ctype, object_id=instance.id, pub_date=pub_date, user = user)

def delete_stream_item(sender, instance, signal, *args, **kwargs):
  instance.delete()

# Send a signal on post_save for each of these models
for model in [Fe, Event ]:
    post_save.connect(create_stream_item, sender=model)
    post_delete.connect(delete_stream_item, sender=model)

【问题讨论】:

  • 我在 post_save 行下方添加了这个:post_delete.connect(delete_stream_item, sender=model) 并创建了一个函数 delete_stream_item(),其中包含 'instance.delete()'。没用。
  • 请编辑您的帖子并将代码放入其中。
  • 就这么多了,我已经从我的项目中删除了它,因为它无论如何都不起作用。
  • 是的,但编辑您的帖子并将代码放入其中。这就是您在这里获得帮助的方式。
  • @Monique 你好!我想我也在经历同样的教程并遇到了这种情况。我只是想知道,您选择的答案是否仍然有效并且没有任何问题?正如回答它的人警告说未经测试的那样,我想知道它是否适合长期使用!如果您能帮助我,我将不胜感激。谢谢!

标签: python django django-models signals


【解决方案1】:

在您的 delete_stream_item() 函数中,instance 是刚刚删除的对象,在您的情况下是 FeEvent 实例。您想要的是检索所有相关的StreamItem 实例(使用instance ctype 和pk)并删除它们。

警告:未经测试的代码:

def delete_stream_item(sender, instance, signal, *args, **kwargs):
    ctype = ContentType.objects.get_for_model(instance)
    StreamItem.objects.filter(content_type=ctype, object_id=instance.id).delete()

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 2011-10-14
    • 2018-02-04
    • 1970-01-01
    • 2012-05-14
    • 2016-05-02
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多