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