2013-12-26 2 views
0

Вот модель, которую я создал для создания ленты новостей. A StreamItem создается с использованием сигнала post_save() всякий раз, когда создается экземпляр моделей Fe и Event. Все работает нормально. Теперь я хочу удалить любой экземпляр StreamItem всякий раз, когда экземпляры Fe и Event удаляются usinf post_delete(). Является ли это возможным?используя post_delete сигнал для удаления 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) 
+0

я добавил: post_delete.connect (delete_stream_item, отправитель = модель) ниже post_save линии и создал функцию delete_stream_item() с 'instance.delete()' в нем. Не работает. – toothie

+0

отредактируйте свой пост и введите код внутри. –

+0

его просто так, я удалил его из моего проекта, так как он все равно не работает. – toothie

ответ

1

В вашей delete_stream_item() функции instance является объектом, который только что был удален, в вашем случае либо Fe или Event экземпляра. Вы хотите получить все связанные 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() 
Смежные вопросы