جلب صف طفيف واحد بناء على قيمة أقصى باستخدام Django Orm
-
06-09-2019 - |
سؤال
لدي نموذج "سوق" له علاقة واحدة بعدة نموذج آخر، "عقد":
class Market(models.Model):
name = ...
...
class Contract(models.Model):
name= ...
market = models.ForeignKey(Market, ...)
current_price = ...
أرغب في جلب كائنات السوق جنبا إلى جنب مع العقد بأقصى سعر لكل منها. هذه هي الطريقة التي أفعلها عبر SQL RAW:
SELECT M.id as market_id, M.name as market_name, C.name as contract_name, C.price
as price from pm_core_market M INNER JOIN
(SELECT market_id, id, name, MAX(current_price) as price
FROM pm_core_contract GROUP BY market_id) AS C
ON M.id = C.market_id
هل هناك طريقة لتنفيذ هذا دون استخدام SQL؟ إذا كان هناك، ما الذي يجب أن يكون مطلوبا من حيث الأداء؟
المحلول
Django 1.1 (حاليا Beta) يضيف تجميع دعم قاعدة بيانات API. يمكن إجراء استعلامك مثل هذا:
from django.db.models import Max, F
Contract.objects.annotate(max_price=Max('market__contract__current_price')).filter(current_price=F('max_price')).select_related()
يولد هذا استعلام SQL التالي:
SELECT contract.id, contract.name, contract.market_id, contract.current_price, MAX(T3.current_price) AS max_price, market.id, market.name
FROM contract LEFT OUTER JOIN market ON (contract.market_id = market.id) LEFT OUTER JOIN contract T3 ON (market.id = T3.market_id)
GROUP BY contract.id, contract.name, contract.market_id, contract.current_price, market.id, market.name
HAVING contract.current_price = MAX(T3.current_price)
يستخدم API انضماما إضافيا بدلا من Sacquery (مثل الاستعلام الخاص بك يفعل). من الصعب معرفة الاستعلام الأسرع بشكل أسرع، خاصة دون معرفة نظام قاعدة البيانات. أقترح عليك القيام ببعض المعايير واتخاذ قرار.
لا تنتمي إلى StackOverflow