জ্যাঙ্গোতে কীভাবে নির্বাচন করবেন?


91

ক্ষেত্রের সর্বাধিক মান দেওয়ার জন্য কীভাবে আমি একটি ক্যোয়ারী চালাতে পারি তা সম্পর্কে আমার কাছে একটি তালিকা রয়েছে:

আমি এই কোডটি ব্যবহার করছি:

def get_best_argument(self):
    try:
        arg = self.argument_set.order_by('-rating')[0].details
    except IndexError:
        return 'no posts'
    return arg

রেটিং একটি পূর্ণসংখ্যা

উত্তর:


173

এই দেখুন । আপনার কোডটি নীচের মতো কিছু হবে:

from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}

আপনি এটি বিদ্যমান ক্যোয়ারসেটগুলিতেও ব্যবহার করতে পারেন:

from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}

আপনার যদি সর্বাধিক মানটি ধারণ করে এমন মডেল উদাহরণটির প্রয়োজন হয় তবে আপনার পোস্ট করা কোডটি সম্ভবত এটি করার সর্বোত্তম উপায়:

arg = args.order_by('-rating')[0]

নোট করুন যে ক্যোরিসেটটি খালি থাকলে এই ত্রুটি ঘটবে, অর্থাত্ যদি কোন যুক্তি কোয়েরির সাথে মেলে না (কারণ [0]অংশটি উত্থাপন করবে IndexError)। আপনি যদি সেই আচরণটি এড়াতে এবং পরিবর্তে কেবল Noneসেই ক্ষেত্রে ফিরে আসতে চান তবে ব্যবহার করুন .first():

arg = args.order_by('-rating').first() # may return None

4
আমার সর্বাধিক যুক্তিযুক্ত বস্তুটির দরকার আছে, তাই আমি বিশদ ক্ষেত্রটি মুদ্রণ করতে পারি। আরগস.অগ্রিগেট (সর্বোচ্চ ('রেটিং')) কলটি সর্বাধিক রেটিং দেয়। আমি সর্বোচ্চ রেটিং সহ আরগের সন্ধান করছি।
জন

4
আপনার প্রস্থানিত কোড - আরগমেন্ট.ওবজেক্টস.অর্ডার_বি ("- রেটিং") [0] এর সাথে কী সমস্যা?
আদমকেজি

73

জাজানোতে ' সর্বশেষ (ক্ষেত্রের নাম = কোনও নয়) ' ফাংশন রয়েছে যা সর্বশেষ (সর্বাধিক মান) এন্ট্রি সন্ধান করে। এটি কেবল তারিখের ক্ষেত্রগুলিতে নয় স্ট্রিং এবং পূর্ণসংখ্যার সাথেও কাজ করে।

এই ফাংশনটি কল করার সময় আপনি ক্ষেত্রের নাম দিতে পারেন:

max_rated_entry = YourModel.objects.latest('rating')
return max_rated_entry.details

অথবা আপনি ইতিমধ্যে আপনার মডেলগুলির মেটা ডেটাতে সেই ক্ষেত্রের নামটি দিতে পারেন:

from django.db import models

class YourModel(models.Model):
    #your class definition
    class Meta:
        get_latest_by = 'rating'

এখন আপনি কোনও পরামিতি ছাড়াই 'সর্বশেষ ()' কল করতে পারেন:

max_rated_entry = YourModel.objects.latest()
return max_rated_entry.details

4
এটি ব্যবহারের দুর্দান্ত উপায় latest()। আপনার যদি ন্যূনতম মান সহ রেকর্ডের প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন earliest()
সেকস

7
latest()এবং earliest()অ-তারিখ ক্ষেত্রের সাথেও কাজ করে তবে এটি বাস্তবায়নের একটি পার্শ্ব প্রতিক্রিয়া। আপনার ব্যবহার করা উচিত <your-queryset>.order_by('<interested-field>').first()বা <your-queryset>.order_by('<interested-field>').last()আপনার কোডটি এখনও কার্যকর হবে তা নিশ্চিত করার জন্য এমনকি জ্যাঙ্গো বিকাশকারীরা কেবল তারিখের ক্ষেত্রগুলির সাথে কাজ করার জন্য পরিবর্তন latest()এবং earliest()বাস্তবায়ন করবে ।
mrnfrancesco

এটি একটি খারাপ উত্তর: 1) ইতিমধ্যে এটি ইতিমধ্যে বাস্তবায়নের বিশদটি লক্ষ্য করা গেছে এবং ভবিষ্যতে পরিবর্তন করা যেতে পারে 2) এটি খুব পঠনযোগ্য নয় - সর্বাধিক সংখ্যাটি সর্বশেষতম সংরক্ষিত নয় (বা অন্য কোনও অর্থে)
মিখাইল গেরাসিমভ

47

আমি আমার প্রকল্পের জন্য এটি পরীক্ষা করেছি, এটি ও (এন) সময়ে সর্বাধিক / মিনিট সন্ধান করে:

from django.db.models import Max

# Find the maximum value of the rating and then get the record with that rating. 
# Notice the double underscores in rating__max
max_rating = App.objects.aggregate(Max('rating'))['rating__max']
return App.objects.get(rating=max_rating)

পুরো টেবিলটি বাছাই করা এবং শীর্ষটি পেতে (ও (এন * লগেন)) পাওয়ার চেয়ে দক্ষতার সাথে আপনাকে সর্বোচ্চ উপাদানগুলির মধ্যে একটি পাওয়ার গ্যারান্টিযুক্ত।


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

4
@ আফাহিম আমি আপনার পোষ্ট কোডটি পুরোপুরি সঠিক বলে মনে করি না। যদি দেখা যায় যে আপনার একাধিকেরও বেশি রয়েছে (আসুন ধরে নিই যে আপনার কাছে পাঁচটি তারা সহ দুটি অ্যাপ রয়েছে) "get" ব্যবহার করা ত্রুটি বাড়িয়ে তুলবে।
রায়ডেল মিরান্ডা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.