簡體   English   中英

Django,prefetch_related后更新object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM