Django,在prefetch_related之后更新对象

时间:2018-01-05 07:50:18

标签: python django django-orm

我有以下型号:

class Publisher(models.Model):
    name = models.CharField(max_length=30)


class Book(models.Model):
    title = models.CharField(max_length=100)
    publisher = models.ForeignKey(Publisher)

在我的views.py中,当我想要显示发布商页面时,我也想展示他们的书籍,所以我通常会这样做:

publisher = Publisher.objects.prefetch_related('book_set').filter(pk=id).first()

然后,在经过一些处理之后,我也会对书籍进行一些工作

for book in publisher.book_set.all():
    foo()

这很好用,但我有一个问题。如果在查询和for循环之间添加了一本书,则publisher.book_set.all()将不会添加新添加的书籍,因为它已被预取。

有没有办法更新发布商对象?

2 个答案:

答案 0 :(得分:7)

您可以删除实例上的整个预取缓存:

if hasattr(publisher, '_prefetched_objects_cache'):
    del publisher._prefetched_objects_cache

如果您只想删除特定的预取关系:

if hasattr(publisher, '_prefetched_objects_cache'):
    publisher._prefetched_objects_cache.pop('book_set', None)

答案 1 :(得分:1)

还可以删除Django doc中的所有prefetch_related

  

要清除任何与prefetch_related有关的行为,请将None作为参数传递::

     

non_prefetched = qs.prefetch_related(None)