Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 Django-预删除信号不更新实例';s外键字段_Python_Django_Django Models_Django Views_Django Signals - Fatal编程技术网

Python Django-预删除信号不更新实例';s外键字段

Python Django-预删除信号不更新实例';s外键字段,python,django,django-models,django-views,django-signals,Python,Django,Django Models,Django Views,Django Signals,我正在尝试为我的Django应用程序的Like型号使用pre_delete信号。Like型号有一个Book外键。Book模型有一个numoflikes字段。最后,我试图从我的pre\u delete信号中更新这个num\u of\u likes字段。只是我做不到 我的代码将使问题变得非常清楚,我认为(请特别注意评论和打印声明): 图书/模型.py: class Book(models.Model): num_of_likes = models.IntegerField() class

我正在尝试为我的Django应用程序的
Like
型号使用
pre_delete
信号。
Like
型号有一个
Book
外键。
Book
模型有一个
numoflikes
字段。最后,我试图从我的
pre\u delete
信号中更新这个
num\u of\u likes
字段。只是我做不到

我的代码将使问题变得非常清楚,我认为(请特别注意评论和打印声明):

图书/模型.py

class Book(models.Model):
    num_of_likes = models.IntegerField()
class Like(models.Model):
    user = models.ForeignKey(User)
    book = models.ForeignKey(Book)
class DeleteLikeView(APIView):

    def post(self, request, book):
        book = get_object_or_404(Book, id=book)
        print(book.num_of_likes) # Prints, say, 10
        like = Like.objects.get(user=request.user, book=book)
        like.delete() # triggers signal handler below (should update `book.num_of_likes`)
        print(book.num_of_likes) # Still prints 10, expected 9 <------ PROBLEM
        return ...
@receiver(pre_delete, sender=Like)
def delete_book_like(sender, instance, **kwargs):
    print(instance.book.num_of_likes) # Prints 10
    instance.book.num_of_likes -= 1
    instance.book.save()
    print(instance.book.num_of_likes) # Prints 9, as expected
喜欢/型号。py

class Book(models.Model):
    num_of_likes = models.IntegerField()
class Like(models.Model):
    user = models.ForeignKey(User)
    book = models.ForeignKey(Book)
class DeleteLikeView(APIView):

    def post(self, request, book):
        book = get_object_or_404(Book, id=book)
        print(book.num_of_likes) # Prints, say, 10
        like = Like.objects.get(user=request.user, book=book)
        like.delete() # triggers signal handler below (should update `book.num_of_likes`)
        print(book.num_of_likes) # Still prints 10, expected 9 <------ PROBLEM
        return ...
@receiver(pre_delete, sender=Like)
def delete_book_like(sender, instance, **kwargs):
    print(instance.book.num_of_likes) # Prints 10
    instance.book.num_of_likes -= 1
    instance.book.save()
    print(instance.book.num_of_likes) # Prints 9, as expected
喜欢查看视图。py:

class Book(models.Model):
    num_of_likes = models.IntegerField()
class Like(models.Model):
    user = models.ForeignKey(User)
    book = models.ForeignKey(Book)
class DeleteLikeView(APIView):

    def post(self, request, book):
        book = get_object_or_404(Book, id=book)
        print(book.num_of_likes) # Prints, say, 10
        like = Like.objects.get(user=request.user, book=book)
        like.delete() # triggers signal handler below (should update `book.num_of_likes`)
        print(book.num_of_likes) # Still prints 10, expected 9 <------ PROBLEM
        return ...
@receiver(pre_delete, sender=Like)
def delete_book_like(sender, instance, **kwargs):
    print(instance.book.num_of_likes) # Prints 10
    instance.book.num_of_likes -= 1
    instance.book.save()
    print(instance.book.num_of_likes) # Prints 9, as expected

为什么
book.num of_likes
delete_book_like
中得到更新,但是更改不会显示在
DeleteLikeView
中?

删除视图中的
book
与信号处理程序中的
实例.book
不同。Python对象不会神奇地发现底层db表示已经更改。打印前,您可以从\u db调用
refresh\u

 book.refresh_from_db()
 print(book.num_of_likes)
或者只需将
num\u of_likes
作为一个动态计算的属性,您就不必担心非规范化数据的完整性:

class Book(models.Model):
    @property
    def num_of_likes(self):
        return self.like_set.count()

delete视图中的
book
与信号处理程序中的
instance.book
是不同的Python对象。Python对象不会神奇地发现底层db表示已经更改。打印前,您可以从\u db调用
refresh\u

 book.refresh_from_db()
 print(book.num_of_likes)
或者只需将
num\u of_likes
作为一个动态计算的属性,您就不必担心非规范化数据的完整性:

class Book(models.Model):
    @property
    def num_of_likes(self):
        return self.like_set.count()

谢谢你的解决方案。你能给我指一些关于你推荐的@property decorator的文档吗?谢谢,总是一个好的开始。您可能还对感谢您的解决方案感兴趣。你能给我指一些关于你推荐的@property decorator的文档吗?谢谢,总是一个好的开始。您可能也对以下内容感兴趣: