Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用post_delete信号删除StreamItem_Python_Django_Django Models_Signals - Fatal编程技术网

Python 使用post_delete信号删除StreamItem

Python 使用post_delete信号删除StreamItem,python,django,django-models,signals,Python,Django,Django Models,Signals,下面是我创建的一个模型,用于创建新闻提要。每当创建模型Fe和事件的实例时,都会使用post_save()信号创建一个StreamItem。一切正常。现在,每当使用post_delete()信号删除Fe和Event实例时,我想删除StreamItem的任何实例。可能吗 class StreamItem(models.Model): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerFi

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

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)

delete\u stream\u item()
函数中,
instance
是刚刚被删除的对象,在您的例子中是
Fe
事件
实例。您需要检索所有相关的
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()

我在post\u保存行下面添加了:post\u delete.connect(delete\u stream\u item,sender=model),并创建了一个函数delete\u stream\u item(),其中包含“instance.delete()”。不起作用。请编辑您的帖子并将代码放入其中。就是这么多,我已将其从我的项目中删除,因为它无论如何都不起作用。是的,但请编辑您的帖子并将代码放入其中。这就是你在这里得到帮助的方式。@Monique你好!我想我也经历了同样的教程,并且遇到了这种情况。我只是想知道,你选择的答案是否仍然有效并且没有任何问题?正如回答这个问题的人所警告的那样,我想知道,从长远来看,它是否有好处!如果你能帮助我,我将不胜感激。非常感谢。