簡體   English   中英

在 Django 中使用外鍵和多對多使用 values_list 注釋查詢

[英]Annotating a query with a values_list, using foreign key and many-to-many in Django

我有一個 django 操作,我分兩步執行,但我想看看是否有辦法只使用 1 個數據庫查詢。 假設我有這些模型:

class Budget(models.Model):
    ...

class Company(models.Model):
    budgets = models.ManyToManyField(
        Budget, related_name="companies"
    )

class Employee(models.Model):
    company = models.ForeignKey(
        Company, on_delete=models.CASCADE, related_name="employees"
    )

現在我想獲取一名員工,並通過公司查找與該員工相關聯的預算 ID:

employee = Employee.objects.get(id=employee_id)

allowed_budgets = employee.company.budgets.values_list("id", flat=True)

我是否正確,這將執行 2 個數據庫查詢? 有沒有辦法在Employee上添加allowed_budgets作為注釋,因此只執行 1 個查詢?

employee = Employee.objects
     .annotate(
        allowed_budgets=# how do I get employee.company.budgets.values_list("id", flat=True) here?
     )
     .get(id=employee_id)

非常感謝!

也許你可以創建一個子查詢的子類,改變它輸出的 SQL。 子查詢和注釋是強大的工具,它們可以嵌套並組合成更復雜的計算。 例如:

from django.db.models import OuterRef, Subquery,Count
Employee.objects.annotate(
    count=Subquery(
        Budget.objects
            .filter(budgets=OuterRef('id'))            
            .values('budgets')            
            .annotate(count=Count('id'))            
            .values('count')
    )
)

對於PostgreSQL

from django.contrib.postgres.aggregates import ArrayAgg, StringAgg
Employee.objects.annotate(
    cls=Subquery(
        Budgets.objects.filter(id=OuterRef('id')).values('id')\
        .annotate(budgets=ArrayAgg('budgets')).values('budgets')
    )
)

更多信息: https://django.readthedocs.io/en/stable/ref/models/expressions.html

暫無
暫無

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

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