2017-08-27 10 views
1

ブログオブジェクトの 'num_posts'フィールドが、そのブログに属する投稿が削除されるたびに減少し、投稿が毎回増加するようにしようとしています。作成した。django post_delete()シグナルハンドラが機能しない

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() 

しかし、記事のオブジェクトを削除する際に、何らかの理由で、ロジックは動作しません:私は簡単に十分な方法で保存、オーバーロードを実装することができました。私は、シグナルサブモジュールのhandlers.pyファイルのシグナルハンドラを使用してベストプラクティスに従っています。私はメソッドの私のready()メソッドのapps.pyのサブモジュールをインポートします

文法上のエラーや何かエラーはまったくありません。関連するブログのnum_postsフィールドは単に減少しません。ここに関連するコードは次のとおりです。私の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 

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 

また、ここではあなたたちが見ることができるだけの場合には、完全な投稿はmodels.py内のオブジェクトであります私が紛失しているもの:

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() 

それは明らかなことだと思う。どこからでもエラーメッセージが表示されないように見えるので、私は迷っています。

+0

'kwargsから[ "インスタンス"]場合は、テストしているのはなぜ== NONE'? 'pre_delete'シグナルは常にインスタンスを渡します、あるいは重大な間違いがあります。 'Blogs.num_posts'は単に' self.pages_set.count() 'を返すプロパティとして定義できます。これは、手動での加算と減算よりもエラーが発生しにくいでしょう。 –

答えて

0

あなたは、関連するオブジェクトの数を取得するための簡単な方法はしかし、ありますhandle_bpost_delete

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

で更新Blogsインスタンスを保存するのを忘れていました。必要なときにデータベースにカウントさせるだけで済みます。非常に高速で、エラーが発生しにくい。

例:

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

関連する問題