簡體   English   中英

Django 使用來自相關 model 的列表注釋查詢集

[英]Django annotate queryset with list from related model

這是我第一次如此詳細地使用 Django 查詢集,所以我有點困惑。

我有兩個模型:

資產(Django model 但不由 Django 管理):

id = models.BigIntegerField(primary_key=True, db_index=True, editable=False)
asset = models.CharField(
    max_length=255, null=False
)
ip = models.CharField(
    max_length=255,
    null=True,
)
entity = models.ForeignKey(
    Entity,
    on_delete=models.CASCADE,
    related_name="owned_assets",
    db_constraint=False,
)

軟件(同上——不由 Django 管理):

id = models.BigIntegerField(primary_key=True, db_index=True, editable=False, null=False)
entity = models.ForeignKey(
    Entity,
    db_constraint=False,
    null=False,
)
asset = models.ForeignKey(
    Asset, db_constraint=False, null=False
)
software = models.CharField(
    max_length=64, null=False
)
version = models.CharField(
    max_length=64, null=False
)

當用戶獲取所有資產時,我想用相關軟件裝飾資產查詢集。 但是,軟件條目在資產和實體之間並不是唯一的,單個資產可以有多個與之關聯的軟件條目。 go 關於用這些軟件條目注釋基本資產查詢集的最佳方法是什么? 如何將softwareversion列表添加到查詢集中的單個資產?

是否可以在數據庫中而不是在 memory 中執行此操作? 謝謝

您可以使用asset.software_set.all()反向訪問關系,例如:

assets = Asset.objects.all()
for asset in assets:
    print((asset, asset.software_set.all()))

但這相當低效,因為對於NAsset對象,它將對數據庫進行N+1次查詢。 首先是獲取所有Asset的查詢,然后是每個資產的查詢以獲取相關的software_set.all()對象。

您可以更好地利用.prefetch_related(…) [Django-doc]通過一個額外的查詢來獲取 memory 中的所有相關對象,然后在 Django/Python 層加入,所以:

assets = Asset.objects..prefetch_related('software_set')
for asset in assets:
    print((asset, asset.software_set.all()))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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