জ্যাঙ্গোতে () মানগুলিতে আইটেমগুলির নামকরণ কীভাবে?


111

আমি djangoproject.com এ এই টিকিটের মতো বেশ কিছু করতে চাই , তবে কিছু সংযোজন বিন্যাস সহ। এই কোয়েরি থেকে

>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]

আমি এরকম কিছু পেতে চাই:

>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]

অন্য কোন অন্তর্নির্মিত উপায় আছে বা আমাকে নিজেই এটি করতে হবে?

উত্তর:


74

এটি কিছুটা হ্যাকি, তবে আপনি এই extraপদ্ধতিটি ব্যবহার করতে পারেন :

MyModel.objects.extra(
  select={
    'renamed_value': 'cryptic_value_name'
  }
).values(
  'renamed_value'
)

এটি মূলত SELECT cryptic_value_name AS renamed_valueএসকিউএল-তে করে।

আরেকটি বিকল্প, আপনি যদি সর্বদা নাম পরিবর্তিত সংস্করণ চান তবে ডিবিটির ক্রিপ্টিক নাম রয়েছে তবে নতুন নাম দিয়ে আপনার ক্ষেত্রটির নাম রাখবেন তবে db_columnডিবিতে আসল নামটি উল্লেখ করতে ব্যবহার করুন ।


6
স্পষ্টতই 1.7 এ। * আপনি নামমাত্র যুক্তি হিসাবে খালি সরাসরি নাম লিখতে সক্ষম হবেন values()। সূত্র: কোড. djangoproject.com/ticket/16735
গ্রেগলটসভ

19
-1 কারণ .values(supports__through_tables)এবং এই হ্যাকটি না (ঘটনাক্রমে সম্ভবত ValuesQuerySetডিক কীগুলির নাম পরিবর্তন করতে ইচ্ছুক সবচেয়ে স্পষ্টভাবে ব্যবহারের কেস )
উইম

4
টেবিলগুলির মাধ্যমে (। মূল্যবোধগুলি (সমর্থন_পড়ু_সারণী)) এর মাধ্যমে কেউ কি এর উপায় খুঁজে পেয়েছে?
ফ্রান্সোইস কনস্ট্যান্ট

12
দুর্ভাগ্যক্রমে, এই সমাধানটি এর মতো সম্পর্কিত নামগুলিকে সমর্থন করে না .values('foreignkeymodel__id', 'foreignkeymodel__name')
রিসাদিনহা

13
Model.objects.annotate (my_alias = এফ ( 'some__long__name__to__alias')) থেকে টিকেট 16735. মান ( 'my_alias')।
ইউজিন

198

থেকে django>=1.8আপনি টিকা এবং এফ অবজেক্ট ব্যবহার করতে পারেন

from django.db.models import F

MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value')

এছাড়াও extra()থেকে অবচিত হতে যাচ্ছে জ্যাঙ্গো দস্তাবেজ:

এটি একটি পুরাতন এপিআই যা ভবিষ্যতে কোনও সময়ে আমাদের অবমূল্যায়নের লক্ষ্য। আপনি যদি অন্য ক্যোয়ারসেট পদ্ধতিগুলি ব্যবহার করে আপনার ক্যোয়ারীটি প্রকাশ করতে না পারেন তবেই এটি ব্যবহার করুন। আপনার যদি এটির ব্যবহারের প্রয়োজন হয় তবে দয়া করে আপনার ব্যবহারের ক্ষেত্রে কোয়েরি.সেট.এেক্সট্রা কীওয়ার্ড ব্যবহার করে একটি টিকিট ফাইল করুন (দয়া করে প্রথমে বিদ্যমান টিকিটের তালিকাটি পরীক্ষা করুন) যাতে আমরা অতিরিক্ত () অপসারণের অনুমতি দেওয়ার জন্য কোয়েরিसेट এপিআই বাড়িয়ে তুলতে পারি। আমরা আর এই পদ্ধতির জন্য বাগগুলি উন্নত বা ঠিক করছি না।


4
এই উত্তরটি শুধুমাত্র কাজ করে django>=1.8। জিজ্ঞাসা এক্সপ্রেশন annotateসমষ্টি ব্যতীত অন্য এক্সপ্রেশন গ্রহণ করতে সক্ষম । তথ্যসূত্র: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
ইয়ো

4
এটি কাজ করে, তবে মূল প্রশ্নে সিনট্যাক্স প্রস্তাবিত এতটা সুন্দর নয় ? MyModel.objects.values(renamed_value='cryptic_value_name')
Wim

12
MyModel.objects.values(renamed_value=models.F('cryptic_value_name'))কাজ
জারকোল

4
এই উত্তরটি কাজ করে তবে অনর্থক। পাসওয়ার্ডটি দেওয়া আর্গুমেন্টগুলি আপনার পক্ষ থেকে values()পাস করা হয়েছে annotate()(দেখুন ডকস.ডজ্যাঙ্গোপ্রজেক্ট /en/2.2/ref/models/querysets/… )। উত্তরটি MyModel.objects.values(renamed_value=F('cryptic_value_name'))সহজ এবং আরও পরিষ্কার, আইএমও।
tobias.mcntory

86

অন্য কোনও পরিচালকের পদ্ধতি ব্যবহার না করে (পরীক্ষিত v3.0.4):

from django.db.models import F

MyModel.objects.values(renamed_value=F('cryptic_value_name'))

জ্যাঙ্গো ডক্স থেকে অংশ :

একটি এফ () অবজেক্ট একটি মডেল ক্ষেত্র বা টীকাযুক্ত কলামের মান উপস্থাপন করে। মডেল ক্ষেত্রের মানগুলি উল্লেখ করা এবং ডেটাবেস থেকে পাইথন স্মৃতিতে টান না দিয়ে এগুলি ব্যবহার করে ডাটাবেস ক্রিয়াকলাপ সম্পাদন করা সম্ভব করে।


5
একাধিক মানের জন্য আপনি ব্যবহার করতে পারেন:MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
16'19

4
তবে আপনি যদি একটি মান পরিবর্তন করতে চান এবং অন্যটি রাখতে চান ? টীকা দিয়ে এটি সম্ভব: inv.annotate(name=F('stock__name')).values('name', "price")তবে এই পদ্ধতিতে কীভাবে এই ক্ষেত্রে কাজ করা উচিত তা আমি দেখছি না। inv.values(name=F("stock__name"), price=F("price"))-> টীকায়নের 'দাম' মডেলটির সাথে একটি ক্ষেত্রের সাথে দ্বন্দ্ব
মাল্টে

4
@ মাল্টে আমি মনে করি এটি জটিল করার দরকার নেই। শুধু চেষ্টা করুন inv.values('price', name=F("stock__name"))। পাইথনে আপনি নামবিহীন যুক্তির পরে কেবল যুক্তি যুক্ত করতে পারেন।
অর্পিত সিং

0

আমি জঙ্গো 1.11.6 এর সাথে কাজ করছি

(এবং কী: মান জুটি গৃহীত উত্তরের বিপরীতে)

এইভাবে আমি এটি আমার প্রকল্পের জন্য কাজ করছি

def json(university):
    address = UniversityAddress.objects.filter(university=university)
    address = address.extra(select={'city__state__country__name': 'country', 'city__state__name': 'state', 'city__name': 'city'})
    address = address.values('country', 'state', "city", 'street', "postal_code").get()
    return address

নোট করুন যে যুগোপযোগী অবজেক্টস.ফিল্টার () অতিরিক্ত ()। মানগুলি () উপরের মত একই।


আপনি দেখতে পাচ্ছেন যে .extra(select={cryptic_value:ranamed_value})এর বিপরীত কী রয়েছে: গৃহীত উত্তরের তুলনায় মান
সুদীপ ভট্টারাই

-6

আপনি যদি মোডের কয়েকটি ক্ষেত্রের নাম পরিবর্তন করতে চান তবে এটি সাধারণের চেয়ে বেশি।

চেষ্টা করুন

projects = Project.objects.filter()
projects = [{'id': p.id, 'name': '%s (ID:%s)' % (p.department, p.id)} for p in projects]

এখানে আমার nameটেবিলে কোনও ক্ষেত্র নেই, তবে আমি কিছুটা টুইট করার পরে তা পেতে পারি।


10
-1 এটা queryset, যা একটি চুক্তি ব্রেকার হয় মূল্যায়ণ
Wim
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.