كيف يمكنني الحصول على الكائنات ذات الصلة في إضافي (). القيم () مكالمة في Django؟

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

  •  16-09-2019
  •  | 
  •  

سؤال

شكرا لهذا المنصب أنا قادر على القيام به بسهولة ومجموعة من خلال الاستفسارات في عرض Django:

Django ما يعادل العد والجماعة

ما أقوم به في تطبيقي يعرض قائمة من أنواع العملة وقيم الوجه المتوفرة في قاعدة البيانات الخاصة بي للبلد، لذلك قد يكون لعملات العملات من المملكة المتحدة قيمة وجها لوجه "1" أو "6 بنس". ال face_value هو 6، currency_type هو "Pence"، المخزنة في طاولة ذات صلة.

لدي الكود التالي في رأيي الذي يجعلني 90٪ من الطريق هناك:

def coins_by_country(request, country_name):
    country = Country.objects.get(name=country_name)
    coin_values = Collectible.objects.filter(country=country.id, type=1).extra(select={'count': 'count(1)'},
                               order_by=['-count']).values('count', 'face_value', 'currency_type')
    coin_values.query.group_by = ['currency_type_id', 'face_value']
    return render_to_response('icollectit/coins_by_country.html', {'coin_values': coin_values, 'country': country } )

ال currency_type_id يأتي عبر الرقم المخزن في مجال المفتاح الأجنبي (أي 4). ما أريد القيام به هو استرجاع الكائن الفعلي الذي يشير إليه كجزء من الاستعلام (نموذج العملة، حتى أتمكن من الحصول على حقلنا في القالب).

ما هي أفضل طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول 2

select_related() حصلت لي قريبا جدا، لكنها أرادتني أن أضيف كل مجال اختارته group_by بند.

لذلك حاولت إلحاق values() بعد select_related(). وبعد لا اذهب. ثم جربت التباديلات المختلفة لكل مناصب مختلفة من الاستعلام. إغلاق، ولكن ليس تماما.

انتهى بي الأمر "بالخروج" واستخدام SQL RAW، لأنني أعرف بالفعل كيفية كتابة استعلام SQL.

def coins_by_country(request, country_name):
    country = get_object_or_404(Country, name=country_name)
    cursor = connection.cursor()
    cursor.execute('SELECT count(*), face_value, collection_currency.name FROM collection_collectible, collection_currency WHERE collection_collectible.currency_type_id = collection_currency.id AND country_id=%s AND type=1 group by face_value, collection_currency.name', [country.id] )
    coin_values = cursor.fetchall()
    return render_to_response('icollectit/coins_by_country.html', {'coin_values': coin_values, 'country': country } )

إذا كانت هناك طريقة لتعيين الاستعلام الدقيق في لغة Django QuerySet سأكون فضوليا لمعرفة. أتخيل أن انضمام SQL مع عدد وتجميع أعمدة غير نادرة للغاية، لذلك سأفاجأت إذا لم تكن هناك طريقة نظيفة.

نصائح أخرى

لا يمكنك أن تفعل ذلك values(). وبعد ولكن ليس هناك حاجة لاستخدام ذلك - يمكنك فقط الحصول على الفعلية Collectible الكائنات، وكل واحد سيكون لديه currency_type السمة التي ستكون الكائن المرتبط ذات الصلة.

وكما يوحي justinhamade، باستخدام select_related() سوف تساعد على خفض عدد استفسارات قاعدة البيانات.

وضعها معا، تحصل على:

coin_values = Collectible.objects.filter(country=country.id, 
                    type=1).extra(
                    select={'count': 'count(1)'}, 
                    order_by=['-count']
                ).select_related()

هل حاولت select_related () http://docs.djangoproject.com/en/dev/ref/models/querys/#id4.

أنا استخدمه كثيرا يبدو أنه يعمل بشكل جيد، ثم يمكنك الذهاب Coin_Values.mency.name.

أيضا لا أعتقد أنك بحاجة إلى القيام به البلد = البلد. في المرشح الخاص بك، فقط البلد = البلد، لكنني لست متأكدا من الفرق الذي يجعل غير أقل كتابة.

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