আমি কীভাবে একটি জ্যাঙ্গো ক্যোয়ারীসেটকে ডিক্টের তালিকায় রূপান্তর করতে পারি? আমি এর কোনও উত্তর পাইনি তাই আমি ভাবছি যে আমি যদি ব্যবহার করি এমন কিছু সাধারণ সহায়ক ফাংশন অনুপস্থিত।
আমি কীভাবে একটি জ্যাঙ্গো ক্যোয়ারীসেটকে ডিক্টের তালিকায় রূপান্তর করতে পারি? আমি এর কোনও উত্তর পাইনি তাই আমি ভাবছি যে আমি যদি ব্যবহার করি এমন কিছু সাধারণ সহায়ক ফাংশন অনুপস্থিত।
উত্তর:
.values()পদ্ধতিটি ব্যবহার করুন :
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
দ্রষ্টব্য: ফলাফলটি এমন একটি QuerySetযা বেশিরভাগ তালিকার মতো আচরণ করে তবে বাস্তবে এর উদাহরণ নয় list। আপনার list(Blog.objects.values(…))যদি সত্যই কোনও উদাহরণ প্রয়োজন হয় তা ব্যবহার করুন list।
values(), আমি জানি না যে একই পদ্ধতিতে করার জন্য একটি ভাল পদ্ধতি আছে values()তবে উদাহরণ পদ্ধতিগুলি কল করার সাথেও ?!
.values()পদ্ধতি আপনি টাইপ ফলে ফিরে আসবে ValuesQuerySetযা সাধারণত কি অধিকাংশ ক্ষেত্রে প্রয়োজন হয়।
তবে আপনি যদি চান তবে ValuesQuerySetনীচের উদাহরণে চিত্রিত হিসাবে পাইথন তালিকার বোধগম্যতা ব্যবহার করে আপনি একটি স্থানীয় পাইথন তালিকায় পরিণত করতে পারেন ।
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
আমি উপরের সাহায্যগুলি খুঁজে পেয়েছি যদি আপনি ইউনিট পরীক্ষা লিখছেন এবং জোর করে বলা দরকার যে কোনও ফাংশনের প্রত্যাশিত রিটার্ন মানটি প্রকৃত রিটার্ন মানের সাথে মেলে, এক্ষেত্রে উভয়ই expected_resultএবং actual_resultএকই ধরণের হতে হবে (উদাহরণস্বরূপ অভিধান)।
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
যদি কোনও কারণে আপনার নেটিভ ডেটা প্রকারের প্রয়োজন হয় (যেমন জেএসওএন সিরিয়ালাইজেশন) এটি করার জন্য এটি আমার দ্রুত 'এন' নোংরা উপায়:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
আপনি দেখতে পাচ্ছেন তালিকার ভিতরে ডিকটি তৈরি করা সত্যিই শুকনো নয় তাই যদি কেউ আরও ভাল কোনও উপায় জানেন ...
data = list( blogs )এবং তারপরেও json.dumps( data )। জাভাস্ক্রিপ্টের পাশের বস্তুগুলির একটি গুচ্ছ নিয়ে একটি অ্যারে বেরিয়ে আসে, কোনও পার্সিংয়ের প্রয়োজন নেই।
অভিধানগুলি দেখতে কেমন হওয়া উচিত তা আপনি ঠিক ব্যাখ্যা করেন না তবে সম্ভবত আপনি উল্লেখ করছেন QuerySet.values()। থেকে সরকারী জ্যাঙ্গো ডকুমেন্টেশন :
একটি
ValuesQuerySet- একটিQuerySetসাবক্লাস প্রদান করে যা মডেল-ইনস্ট্যান্স অবজেক্টের পরিবর্তে পুনরাবৃত্ত হিসাবে ব্যবহৃত হয় অভিধানগুলি ফেরত দেয়।এই অভিধানগুলির প্রত্যেকটিই কোনও বস্তুর প্রতিনিধিত্ব করে, মডেল অবজেক্টগুলির বৈশিষ্ট্য নামের সাথে সম্পর্কিত কীগুলি।
তালিকায় Castালাই টাইপ করুন
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
values()জ্যাঙ্গো মডেল ক্ষেত্রটি আপনি যে ডিকটি পেয়েছেন সেটিতে আপনি যে পদ্ধতিটি লিখেছেন সেগুলি ব্যবহার করতে পারেন এবং তারপরে আপনি প্রতিটি ক্ষেত্র সহজেই একটি সূচক মান দ্বারা অ্যাক্সেস করতে পারেন।
এটিকে কল করুন -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
আপনার যা দরকার তা DjangoJSONEncoderএবং listআপনার করতে Querysetকরতে json, সূত্র: একটি দশমিক বস্তুর পাইথন তাদেরকে JSON ধারাবাহিকভাবে
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
values()যুক্তি হিসাবে পাস করে আপনি কোন ক্ষেত্রটি ফিরিয়ে দিতে চান । এছাড়াও সতর্কতা অবলম্বন করুন যদিও দেখে মনে হচ্ছে মানগুলি তালিকার একটি তালিকা আসলে<class 'django.db.models.query.ValuesQuerySet'>না একটি তালিকা দেয় and