جلب صف طفيف واحد بناء على قيمة أقصى باستخدام Django Orm

StackOverflow https://stackoverflow.com/questions/931730

سؤال

لدي نموذج "سوق" له علاقة واحدة بعدة نموذج آخر، "عقد":

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 (مثل الاستعلام الخاص بك يفعل). من الصعب معرفة الاستعلام الأسرع بشكل أسرع، خاصة دون معرفة نظام قاعدة البيانات. أقترح عليك القيام ببعض المعايير واتخاذ قرار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top