জ্যাঙ্গোতে তারিখের পরিসীমা অনুসারে আমি কোয়েরি অবজেক্টগুলি কীভাবে ফিল্টার করব?


248

আমি একটি মডেল মত ক্ষেত্র পেয়েছি যেমন:

class Sample(models.Model):
    date = fields.DateField(auto_now=False)

এখন, আমার একটি তারিখের পরিসীমা দ্বারা অবজেক্টগুলি ফিল্টার করা দরকার।

আমি সব বস্তুর মধ্যে একটি তারিখ আছে যে কিভাবে ফিল্টার করবেন 1-Jan-2011এবং 31-Jan-2011?

উত্তর:


409

ব্যবহার

Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])

অথবা আপনি যদি কেবল মাস অনুযায়ী ফিল্টার করার চেষ্টা করছেন:

Sample.objects.filter(date__year='2011', 
                      date__month='01')

সম্পাদন করা

যেমন বার্নহার্ড ভালান্ট বলেছিলেন, আপনি যদি এমন একটি ক্যোরিসেট চান যা তার সমাধান বাদ দেয় specified range endsআপনি তার সমাধানটি বিবেচনা করুন , যা জিটি / এলটি ব্যবহার করে (এর চেয়ে বেশি / কম-বেশি)।


তারিখ 1 এর ডেটাটাইপ কী? আমি এখন ডেটটাইম অবজেক্ট পেয়েছি।
user469652

8
@ ডকর্ডজার: অ্যাডিটিন্যালি বলা উচিত যে __rangeএতে সীমানা অন্তর্ভুক্ত রয়েছে (যেমন এসকিউএল এর BETWEEN), আপনি যদি সীমা না অন্তর্ভুক্ত না করতে চান তবে আমার জিটি / এলটি সমাধানের সাথে যেতে হবে ...
বার্নহার্ড ভালান্ট

এটি কি কোনও ক্রমে সহজাতভাবে বাছাই করা হয়েছে? যদি তাই হয়, কোন আদেশ? ধন্যবাদ।
রিচার্ড ডান

1
@ রিচার্ডডান অর্ডারিংটি আপনার মডেলের ডিফল্ট অর্ডারিংয়ের উপর ভিত্তি করে তৈরি করা হবে, বা যদি আপনি উপরে উল্লিখিত দ্বারা order_byউত্পাদিত QuerySetউপরে ব্যবহার করেন filter। আমি বছরগুলিতে জ্যাঙ্গো ব্যবহার করি নি।
ক্রোডজার

তারিখের জন্য__আপনি পরের মাসে 01 লাগাতে হবে। এখানে ডকুমেন্টোইনের একটি লিঙ্ক রয়েছে যা এটি তারিখগুলির 00: 00: 00.0000 এ অনুবাদ করে যে এটি বিস্তৃত হয়, সুতরাং আপনার সীমার শেষ দিনটি অন্তর্ভুক্ত করা হয় না is docs.djangoproject.com/en/1.10/ref/models/querysets/# এই ক্ষেত্রে আমি ব্যবহার করি: তারিখ__আরজি = ["% s-% s-1"% (বছর, মাস), "% s-% s- 1 "% (বছর, int (মাস) +1)]
স্পাইরাইল

195

আপনি অবজেক্ট সহ জ্যাঙ্গোfilter ব্যবহার করতে পারেন :datetime.date

import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
                                sampledate__lte=datetime.date(2011, 1, 31))

1 এবং 31 দিন সহ সমস্ত কিছু পেতে, আমাদের ঠিক জিটিই ব্যবহার করতে হবে?
স্যাম স্টোইলিঙ্গা

1
ক্রোডজারগুলির সাহায্যে এই পদ্ধতিটি ব্যবহারের একটি সুবিধা হ'ল আপনি স্ট্রিংয়ের পরিবর্তে ডেটটাইম অবজেক্টগুলি পাস করতে পারেন।
ব্রায়ান কুং

79

ফিল্টার সহ জ্যাঙ্গো রেঞ্জগুলি করার সময় নিশ্চিত হয়ে নিন যে আপনি কোনও তারিখ অবজেক্ট বনাম একটি ডেটটাইম অবজেক্ট ব্যবহার করার মধ্যে পার্থক্য জানেন। __আরঙ্গ তারিখগুলিতে অন্তর্ভুক্ত তবে আপনি যদি শেষ তারিখের জন্য একটি ডেটটাইম অবজেক্ট ব্যবহার করেন তবে সময় নির্ধারিত না হলে এটি সেই দিনের জন্য এন্ট্রিগুলিকে অন্তর্ভুক্ত করবে না।

    startdate = date.today()
    enddate = startdate + timedelta(days=6)
    Sample.objects.filter(date__range=[startdate, enddate])

সেই তারিখের এন্ট্রি সহ স্টার্টেট থেকে শেষ তারিখ পর্যন্ত সমস্ত এন্ট্রি প্রদান করে। এটি উদাহরণস্বরূপ যেহেতু এটি ভবিষ্যতে এক সপ্তাহে এন্ট্রিগুলি ফিরিয়ে দিচ্ছে তবে আপনি ড্রিফ্ট পান।

    startdate = datetime.today()
    enddate = startdate + timedelta(days=6)
    Sample.objects.filter(date__range=[startdate, enddate])

তারিখের ক্ষেত্রগুলির জন্য সময় নির্ধারণ করা হবে তার উপর নির্ভর করে 24 ঘন্টা মূল্যমানের এন্ট্রিগুলি হারিয়ে যাবে।


5
আমি মনে করি যে কীভাবে dateকোনও >>> from datetime import date >>> startdate = date.today()
অ্যালেক্স স্পেন্সার

19

DateTimeField/dateঅবজেক্টের তুলনায় নির্ভুলতার অভাবের কারণে আপনি "প্রতিবন্ধক অমিল" এর কাছাকাছি যেতে পারেন - যা পরিসীমা ব্যবহার করে ঘটতে পারে - একটি ডেটটাইম.টিমেডেল্টা ব্যবহার করে সীমাতে শেষ তারিখের জন্য একটি দিন যোগ করতে পারে। এটি এর মতো কাজ করে:

start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)

ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])

আগে যেমন আলোচনা করা হয়েছে, এর মতো কিছু না করে, শেষ দিনে রেকর্ডগুলি উপেক্ষা করা হয়।

ব্যবহার এড়ানোর জন্য সম্পাদিত datetime.combine- DateTimeFieldথ্রোওয়ে (এবং বিভ্রান্তিকর) datetimeঅবজেক্টের সাথে গোলযোগ না করে পরিবর্তে তারিখের উদাহরণগুলির সাথে লেগে থাকা আরও যুক্তিযুক্ত বলে মনে হয় । নীচে মন্তব্য আরও ব্যাখ্যা দেখুন।


1
এখানে একটি দুর্দান্ত দেলোরেয়ান গ্রন্থাগার রয়েছে যা এটি একটি কাটা
Trojjer

@ টোজ্জার: আশাব্যঞ্জক দেখাচ্ছে, আমরা এখানে ট্রানকেট পদ্ধতিটি কীভাবে ব্যবহার করব?
ইউজিন

@ ইউজিন: আমি এই সমস্ত মাস পরে ঠিক এখনই এটি আবার অন্বেষণ করেছি, এবং আপনি ঠিক বলেছেন যে এই পরিস্থিতি আসলে সর্বোপরি কোনও সহায়তা করে না। এটির চারপাশের একমাত্র উপায়টি আমার মূল প্রতিক্রিয়ার মতো পরামর্শ দেওয়া হয়েছে, যা আপনি যখন কোনও তারিখের উদাহরণের সাথে ফিল্টার করছেন তখন ডেটটাইম মডেল ক্ষেত্রের তুলনায় অতিরিক্ত 'প্যাডিং' সরবরাহ করা। এটি উপরের মতো ডেটটাইম ডটকমাইন পদ্ধতির মাধ্যমে করা যেতে পারে তবে আমি খুঁজে পেয়েছি যে সীমাতে শুরু / শেষের তারিখের মধ্যে একটি টাইমডেল্টা (দিন = 1) যোগ করে কেবল তাত্পর্যকে সামঞ্জস্য করা কিছুটা সহজ হতে পারে - - সমস্যার উপর নির্ভর করে।
ট্রজজার

সুতরাং Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])এ তৈরি বস্তু অন্তর্ভুক্ত হবে না date(2014, 2, 1), যেমন @cademan সহায়কভাবে ব্যাখ্যা। তবে আপনি যদি একদিন যোগ করে শেষের তারিখটি বাড়িয়ে তোলেন তবে আপনি সেই অনুপস্থিত বস্তুগুলিকে (এবং স্বাচ্ছন্দ্যে date(2014, 2, 2)একই তাত্ক্ষণিক কারণে নির্মিত বস্তু বাদ দিয়ে ) একটি ক্যোরিসেট পেয়ে যাবেন । এখানে বিরক্তিকর বিষয় হ'ল নির্দিষ্ট একটি 'ম্যানুয়াল' রেঞ্জটিও created__gte ... created__lte=date(2014, 2, 1)কাজ করে না, যা অবশ্যই স্বতঃস্ফূর্তভাবে স্বজ্ঞাত আইএমএইচও।
ট্রোজজার

1
@ টোজেজার: তারিখের সময়_ফিল্ড__আরঞ্জ = [ডিলোরিয়ান. পার্স ('2014-01-01')। তারিখ, ডিলোরান. পার্স ('2014-02-01')। তারিখ] আমার পক্ষে কাজ করে
ইউজিন

1

সহজ,

YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())

আমার জন্য কাজ কর


3
এটি আমার পক্ষেও, স্পষ্টতার জন্য নুবগুলিতে কাজ করেছিল: (তারিখ__ তারিখ = ...) এর অর্থ (Col যাই হোক না কেন ColOLTheDateIs কলড} __ তারিখ)
রায়ান ডাইনস

2
ওপি একটি ব্যাপ্তির জন্য জিজ্ঞাসা করেছে
ওরফেভ

1

এটিকে আরও নমনীয় করে তুলতে, আপনি নীচের মতো একটি ফিল্টারব্যাকেন্ড ডিজাইন করতে পারেন:

class AnalyticsFilterBackend(generic_filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        predicate = request.query_params # or request.data for POST

        if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is not None:
            queryset = queryset.filter(your_date__range=(predicate['from_date'], predicate['to_date']))

        if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is None:
            queryset = queryset.filter(your_date__gte=predicate['from_date'])

        if predicate.get('to_date', None) is not None and predicate.get('from_date', None) is None:
            queryset = queryset.filter(your_date__lte=predicate['to_date'])
        return queryset

-2

আজও প্রাসঙ্গিক। আপনি এটি করতে পারেন:

import dateutil
import pytz

date = dateutil.parser.parse('02/11/2019').replace(tzinfo=pytz.UTC)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.