django - Django: أي ما يعادل "حدد [اسم العمود] من [tablename]"




2 Answers

وبطبيعة الحال ، ستقوم values و values_list باسترداد القيم الأولية من قاعدة البيانات. لا يستطيع Django أن يعمل "السحر" الخاص به على نموذج ما يعني أنك لن تتمكن من اجتياز العلاقات لأنك عالق بالمعرف الذي يشير إليه المفتاح الخارجي ، بدلاً من حقل ForeignKey.

إذا كنت تريد تصفية هذه القيم ، فيمكنك القيام بما يلي (على افتراض أن column_name عبارة عن ForeignKey يشير إلى MyModel ):

ids = Entry.objects.values_list('column_name', flat=True).filter(...)
my_models = MyModel.objects.filter(pk__in=set(ids))

إليك وثائق لـ values_list()

أردت أن أعرف هل هناك أي شيء يعادل:

select columnname from tablename

مثل يقول جانغو البرنامج التعليمي:

Entry.objects.filter(condition)

يجلب كل الكائنات مع الشرط المحدد. إنه يشبه:

select * from Entry where condition

لكنني أرغب في إنشاء قائمة بعمود واحد فقط (وهو في حالتي مفتاح خارجي). وجدت ذلك:

Entry.objects.values_list('column_name', flat=True).filter(condition)

يفعل الشيء نفسه. ولكن في حالتي ، العمود هو مفتاح خارجي ، ويفقد هذا الاستعلام خاصية مفتاح خارجي. انها مجرد تخزين القيم. لا أستطيع إجراء مكالمات البحث.




لتقييد تعيين استعلام على عمود (أعمدة) محدد تستخدم القيم. (العمود)

من المحتمل أيضًا أن تضيف تمييزًا مميزًا حتى النهاية ، بحيث ينتهي بحثك:

Entry.objects.filter(myfilter).values(columname).distinct()

انظر: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values

للمزيد من المعلومات

اعتمادا على إجابتك في التعليق ، سوف أعود وتحرير.

تصحيح:

لست متأكدا إذا كان النهج الصحيح واحد رغم ذلك. يمكنك الحصول على جميع الكائنات الخاصة بك في قائمة python عن طريق الحصول على queryset عادي عبر عامل تصفية ثم القيام بما يلي:

myobjectlist = map(lambda x: x.mycolumnname, myqueryset)

المشكلة الوحيدة في هذا النهج هي إذا كان طلب البحث الخاص بك كبيرًا ، فسيكون استخدامك للذاكرة كبيرًا بنفس القدر.

على أي حال ، ما زلت غير متأكد من بعض تفاصيل المشكلة.




Related

django django-models