2017-08-27 5 views
1

J'essaie de faire en sorte que le champ 'num_posts' d'un objet blog soit décrémenté chaque fois qu'un article appartenant à ce blog est supprimé, et incrémenté chaque fois qu'un post est créé. Je suis en mesure de mettre en œuvre la méthode surchargée Suffisamment facilement:Le gestionnaire de signal django post_delete() ne fonctionne pas

def save(self, *args, **kwargs): 
    '''After saving a new post, increment the num_posts value in the 
    relevant blog.''' 
    super(Posts, self).save(*args, **kwargs) 
    self.blog_id.num_posts += 1 
    tmp = self.blog_id 
    tmp.save() 

Mais pour une raison quelconque, la logique ne fonctionne pas lors de la suppression d'un objet Messages. Je suis les meilleures pratiques en utilisant des gestionnaires de signal dans un fichier handlers.py dans un sous-module de signaux. Je puis importer le sous-module dans ma méthode ready() dans ma méthode TasksConfig(Appconfig) dans apps.py

Je ne semble pas être obtenir des erreurs de syntaxe ou toute erreur du tout. Le champ num_posts sur le blog concerné ne parvient tout simplement pas à décrémenter. Voici le code correspondant:

De mon handlers.py:

from django.db.models.signals import pre_delete 
from django.dispatch import receiver 
from webcomics.models import Pages, Posts, Blogs 

@receiver(pre_delete, sender=Pages) 
def handle_page_delete(sender, **kwargs): 
    obj = kwargs['instance'] 

    if(obj != None): 
     tmp1 = obj.prev_id 
     tmp2 = obj.next_id 

    if(tmp1 != None): 
     tmp1.next_id = tmp2 
     obj.prev_id = None 

    if(tmp2 != None): 
     tmp2.prev_id = tmp1 
     obj.next_id = None 


@receiver(pre_delete, sender=Posts) 
def handle_bpost_delete(sender, **kwargs): 
    obj = kwargs['instance'] 

    if(obj != None): 
     tmp = Blogs.objects.get(pk = obj.blog_id) 
     tmp.num_pages = tmp.num_pages - 1 

De mon apps.py:

from django.apps import AppConfig 

class WebcomicsConfig(AppConfig): 
    name = 'webcomics' 


class TasksConfig(AppConfig): 
    name = 'tasks' 
    verbose_name = "Tasks" 

    def ready(self): 
     import binshellpress.webcomics.signals.handlers 

De plus, voici les postes à plein objet dans models.py, juste au cas où vous les gars peuvent voir quelque chose qui me manque:

class Posts(models.Model): 
    title = models.CharField(max_length=180) 
    pub_date = models.DateTimeField('date publishied', default=timezone.now) 
    blog_id = models.ForeignKey('Blogs', on_delete=models.CASCADE) 
    series_id = models.ForeignKey('Series', on_delete=models.SET_NULL, 
            blank=True, null=True) 

    # Note: Vanilla TinyMCE Integration seems to be working. Need to 
    # modify the implementation to handle links, images, etc. 
    data = HTMLField() 

    def __str__(self): 
     return self.title 

    def save(self, *args, **kwargs): 
     '''After saving a new post, increment the num_posts value in the 
     relevant blog.''' 
     super(Posts, self).save(*args, **kwargs) 
     self.blog_id.num_posts += 1 
     tmp = self.blog_id 
     tmp.save() 

Je pense que c'est quelque chose d'évident. Je suis juste à perte parce qu'il ne semble y avoir aucun message d'erreur venant de n'importe où.

+0

Pourquoi le test êtes-vous si 'kwargs [ "instance"] == none'? Les signaux 'pre_delete' passent toujours une instance, ou il y a quelque chose qui ne va pas. Et 'Blogs.num_posts' peut être défini simplement comme une propriété qui renvoie' self.pages_set.count() '. Ce serait beaucoup moins sujette aux erreurs que d'ajouter et de soustraire manuellement. –

Répondre

0

Vous avez oublié d'enregistrer la Blogs instance mise à jour dans handle_bpost_delete

def handle_bpost_delete(sender, instance, **kwargs): 
    instance.blog.num_pages -= 1 
    instance.blog.save() 

Il y a un moyen plus simple pour obtenir le nombre d'objets liés, cependant. Vous pouvez simplement laisser la base de données faire le compte quand vous en avez besoin. Très rapide, et beaucoup moins sujette aux erreurs.

Exemple:

from django.db.models import Count 

blogs = Blogs.objects.annotate(num_pages=Count('posts')) 
print(blogs[0].num_pages) 

https://docs.djangoproject.com/en/1.11/topics/db/aggregation/#following-relationships-backwards