আমি কীভাবে একটি জ্যাঙ্গো ক্যোয়ারীসেটকে ডিক্টের তালিকায় রূপান্তর করব?


122

আমি কীভাবে একটি জ্যাঙ্গো ক্যোয়ারীসেটকে ডিক্টের তালিকায় রূপান্তর করতে পারি? আমি এর কোনও উত্তর পাইনি তাই আমি ভাবছি যে আমি যদি ব্যবহার করি এমন কিছু সাধারণ সহায়ক ফাংশন অনুপস্থিত।

উত্তর:


176

.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


7
হ্যাঁ আপনি নির্দিষ্ট ক্ষেত্রগুলিকে values()যুক্তি হিসাবে পাস করে আপনি কোন ক্ষেত্রটি ফিরিয়ে দিতে চান । এছাড়াও সতর্কতা অবলম্বন করুন যদিও দেখে মনে হচ্ছে মানগুলি তালিকার একটি তালিকা আসলে <class 'django.db.models.query.ValuesQuerySet'>না একটি তালিকা দেয় and
dm03514

10
এটি আসলে কোনও তালিকা ফিরিয়ে দেবে না
অ্যাস্ট্রেলটোসভ 25'17

এছাড়াও, আপনি আপনার বস্তুর উদাহরণ পদ্ধতিগুলির ফলাফল পেতে পারবেন না values(), আমি জানি না যে একই পদ্ধতিতে করার জন্য একটি ভাল পদ্ধতি আছে values()তবে উদাহরণ পদ্ধতিগুলি কল করার সাথেও ?!
আসারা 21

34

.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

17
অথবা আপনি list(result)
এটির

12

যদি কোনও কারণে আপনার নেটিভ ডেটা প্রকারের প্রয়োজন হয় (যেমন জেএসওএন সিরিয়ালাইজেশন) এটি করার জন্য এটি আমার দ্রুত 'এন' নোংরা উপায়:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]

আপনি দেখতে পাচ্ছেন তালিকার ভিতরে ডিকটি তৈরি করা সত্যিই শুকনো নয় তাই যদি কেউ আরও ভাল কোনও উপায় জানেন ...


আমার মনে হয় এটি এর সাথে কাজ করেছে data = list( blogs )এবং তারপরেও json.dumps( data )। জাভাস্ক্রিপ্টের পাশের বস্তুগুলির একটি গুচ্ছ নিয়ে একটি অ্যারে বেরিয়ে আসে, কোনও পার্সিংয়ের প্রয়োজন নেই।
আর্থার তারাসভ

3

অভিধানগুলি দেখতে কেমন হওয়া উচিত তা আপনি ঠিক ব্যাখ্যা করেন না তবে সম্ভবত আপনি উল্লেখ করছেন QuerySet.values()। থেকে সরকারী জ্যাঙ্গো ডকুমেন্টেশন :

একটি ValuesQuerySet- একটি QuerySetসাবক্লাস প্রদান করে যা মডেল-ইনস্ট্যান্স অবজেক্টের পরিবর্তে পুনরাবৃত্ত হিসাবে ব্যবহৃত হয় অভিধানগুলি ফেরত দেয়।

এই অভিধানগুলির প্রত্যেকটিই কোনও বস্তুর প্রতিনিধিত্ব করে, মডেল অবজেক্টগুলির বৈশিষ্ট্য নামের সাথে সম্পর্কিত কীগুলি।



1

values()জ্যাঙ্গো মডেল ক্ষেত্রটি আপনি যে ডিকটি পেয়েছেন সেটিতে আপনি যে পদ্ধতিটি লিখেছেন সেগুলি ব্যবহার করতে পারেন এবং তারপরে আপনি প্রতিটি ক্ষেত্র সহজেই একটি সূচক মান দ্বারা অ্যাক্সেস করতে পারেন।

এটিকে কল করুন -

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...



0

আপনি মডেল_ টু ডিক্ট ব্যবহার করে কোনও ফাংশন নীচের হিসাবে সংজ্ঞায়িত করতে পারেন:

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.