[英]Django, update the object after a prefetch_related
我有以下型號:
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()
不會有新添加的書,因為它已被預取。
有沒有辦法更新發布者 object?
您可以刪除實例上的整個預取緩存:
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)
還有可能從Django doc中刪除所有prefetch_related
:
要清除任何prefetch_related行為,請將None作為參數傳遞::
non_prefetched = qs.prefetch_related(None)
有一種更好的方法來清除預取屬性,僅使用公共 Django API,即refresh_from_db()
方法:
# Reloads all fields from the object as well as clearing prefetched attributes
publisher.refresh_from_db()
# Clears one prefetched attribute, will be re-fetched on next access
publisher.refresh_from_db(fields=['book_set'])
for book in publisher.book_set.all():
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.