জাজানোতে আমি কীভাবে একটি ডেটটাইমফিল্ডের একটি তারিখ ফিল্টার করতে পারি?


173

আমি DateTimeFieldএকটি তারিখের সাথে তুলনা ফিল্টার করার চেষ্টা করছি । আমি বোঝাতে চাই:

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))

আমি উত্তর হিসাবে একটি খালি ক্যোরিসেট তালিকা পেয়েছি কারণ (আমার মনে হয়) আমি সময় বিবেচনা করছি না, তবে "যে কোনও সময়" চাই।

এটি করার জন্য জ্যাঙ্গোর কোনও সহজ উপায় নেই?

আমার ডেটটাইম নির্ধারিত সময় আছে, তা হয় না 00:00


5
এটি জ্যাঙ্গোর অন্যতম বিরক্তি। এটি একটি সাধারণ এবং সাধারণ ব্যবহারের ক্ষেত্রে বিবেচনা করা, এটি অর্জনের কোনও সহজ উপায় নেই।
রুবায়িত

সম্পর্কিত: stackoverflow.com/a/22085678/2859614
MackM

উত্তর:


114

এই জাতীয় চেহারা django.views.generic.date_basedনিম্নলিখিত হিসাবে প্রয়োগ করা হয়:

{'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
                            datetime.datetime.combine(date, datetime.time.max))} 

কারণ এটি বেশ ভার্বোস তাই __dateঅপারেটর ব্যবহার করে সিনট্যাক্সটি উন্নত করার পরিকল্পনা রয়েছে । আরও তথ্যের জন্য " # 9596 একটি তারিখের সাথে একটি ডেটটাইমফিল্ডের তুলনা করা খুব শক্ত " পরীক্ষা করুন।


4
ব্যাপ্তি সহ ব্যবহার: Q(created__gte=datetime.combine(created_value, time.min))
ডিঙ্গো

10
দেখে মনে হচ্ছে এটি জ্যাঙ্গো ১.৯ এ অবতরণ করবে: github.com/django/django/commit/…
amjoconn

14
জ্যাঙ্গো 1.9 নতুন:Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))

102
YourModel.objects.filter(datetime_published__year='2008', 
                         datetime_published__month='03', 
                         datetime_published__day='27')

// মন্তব্য পরে সম্পাদনা করুন

YourModel.objects.filter(datetime_published=datetime(2008, 03, 27))

ডয়েস্ট কাজ করে না কারণ এটি 0 মান হিসাবে সেট করা সময়সীমার সাথে একটি ডেটটাইম অবজেক্ট তৈরি করে, তাই ডাটাবেসের সময়টি মেলে না।


উত্তর জন্য THX! প্রথম বিকল্পটি ডেটটাইমফিল্ডগুলির সাথে কাজ করে না। দ্বিতীয় বিকল্প কাজ করে;)। কেউ যদি অন্য কোনও পদ্ধতি জানেন তবে দয়া করে উত্তর দিন
জিডোবিক্স

ডেটটাইম মডিউল ঘন্টা, মিনিট, সেকেন্ড থেকে ডেটটাইম () ব্যবহার করে ডকস.পাইথন.আর.লিবারি / ডেটটাইম.ইচটিএমএল# ডেটটাইম- অবজেক্টগুলি isচ্ছিক । দ্বিতীয়টি ওয়ার্ক প্রতিস্থাপন সহ একটি ওয়ার্কিং প্রকল্পের, আপনি
ডক্সে

আমি জানি এটি
alচ্ছিক

"প্রথম বিকল্পটি ডেটটাইমফিল্ডগুলির সাথে কাজ করে না।" এটি বেশ অবাক হওয়ার মতোই হবে, যেমন ডেটটাইম.ডেটটাইম () একটি ডেটটাইম অবজেক্ট দেয় jangoproject.com/docamentation/0.96/models/basic মডেল সংজ্ঞা এবং উদাহরণগুলি দেখুন: পাব_ডেট = মডেলস.ডেটটাইমফিল্ড () পাব_ডেট = ডেটটাইম (2005, 7, 30)
zalew

"আমি জানি এটি alচ্ছিক, সমস্যাটি হ'ল আমার ডেটটাইমফিল্ডের সময় নির্ধারিত সময় আছে, এটি 00:00 নয়" ওহ, এখন আমি এটি পেয়েছি। হ্যাঁ, কোনও সময় যুক্তি ছাড়াই এটি 00 তে সেট করে, তাই এটি আর ফিরে আসে না :)
জালেউ

88

আইপথনের সময়কালীন ফাংশনটির সাথে আমি যে ফলাফল পেয়েছি তা এখানে:

from datetime import date
today = date.today()

timeit[Model.objects.filter(date_created__year=today.year, date_created__month=today.month, date_created__day=today.day)]
1000 loops, best of 3: 652 us per loop

timeit[Model.objects.filter(date_created__gte=today)]
1000 loops, best of 3: 631 us per loop

timeit[Model.objects.filter(date_created__startswith=today)]
1000 loops, best of 3: 541 us per loop

timeit[Model.objects.filter(date_created__contains=today)]
1000 loops, best of 3: 536 us per loop

ধারণগুলি দ্রুত বলে মনে হচ্ছে


এই সমাধানটি সবচেয়ে সাম্প্রতিক বলে মনে হচ্ছে। আমি অবাক হয়েছি এটি পেয়েছে 4 টি upvotes, কারণ যখন আমি containsসমাধানটি চেষ্টা করি তখন আমি ত্রুটির বার্তাটি Unable to get repr for <class 'django.db.models.query.QuerySet'>
পাই

আমি আজ ফলাফলগুলি পুনরায় যাচাই করি এবং আপডেট করি এবং __containsফিল্টার দ্বারা আপনার ত্রুটিটি ঘটে বলে আমি মনে করি না । তবে আপনি যদি সমস্যাগুলির মধ্যে চলে আসছেন তবে আপনার জাঙ্গো ডক্স উদাহরণটি ব্যবহার করা উচিত __gte
মোরেনো

4
__Contains পদ্ধতিটি আমার পক্ষে ভাল কাজ করে। আমি মনে করি এটি সম্ভবত সেরা উত্তর যেহেতু এটি পারফরম্যান্স তুলনা সরবরাহ করে। আমি একাধিককে ভোট দিয়েছি, কিন্তু আমি অবাক হয়েছি যে এর বেশি উত্সাহ নেই।
রোবটহুমানস

আমি startswithসমাধানটি ভালবাসি ..
w411 3

46

এখন ডেভেলপমেন্ট সংস্করণে তারিখগুলির বিপরীতে ডেটটাইম অবজেক্টগুলির ক্যোয়ারী করার জন্য জাজানোতে __ তারিখের ক্যোরিসেট ফিল্টার রয়েছে । সুতরাং, শীঘ্রই এটি 1.9 এ উপলব্ধ হবে।


হ্যাঁ, এটা 1.9 মধ্যে যোগ করা হয়েছিল docs.djangoproject.com/en/1.9/ref/models/querysets/#date
guival

সর্বোত্তম উত্তর, নতুন জ্যাঙ্গো সংস্করণগুলির জন্য বৈধ
সার্ফার 2

এটি আমার পক্ষে কাজ করে না, কেন কোন ধারণা নেই :( আমি জাজানো ১.১১ এ আছি আমার সঠিক ব্যতিক্রমটি: বাস্তবায়নযোগ্য ত্রুটি: ভিত্তিক ডাটাবেসগুলির সাবক্লাসগুলিতে একটি ডেটটাইমকাস্ট_ডেট () পদ্ধতি প্রয়োজন হতে পারে
আবদুররেহমান খান

44
Mymodel.objects.filter(date_time_field__contains=datetime.date(1986, 7, 28))

উপরে আমি ব্যবহার করেছি কি। এটি কেবল কাজ করে না, এর কিছু সহজাত যৌক্তিক সমর্থনও রয়েছে।


3
এখানে অন্যান্য উত্তরগুলির চেয়ে অনেক ভাল, ধন্যবাদ!
আত্মীয় 17

sssss-Shazam! 💯
ডিপিএস

30

জ্যাঙ্গো ১.৯ হিসাবে, এটি করার উপায় হ'ল __dateএকটি ডেটটাইম অবজেক্ট ব্যবহার করে।

উদাহরণ স্বরূপ: MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))


27

এটি __ বছর, __মনি এবং __ দিন ব্যবহার করার মতো একই ফলাফল তৈরি করে এবং আমার পক্ষে কাজ করে বলে মনে হচ্ছে:

YourModel.objects.filter(your_datetime_field__startswith=datetime.date(2009,8,22))

19
দেখে মনে হচ্ছে এটি তারিখের অবজেক্টটিকে স্ট্রিংয়ে পরিণত করে এবং তারিখগুলির একটি স্ট্রিং তুলনা করে তাই ডিবিকে একটি পূর্ণ টেবিল স্ক্যান করতে বাধ্য করে। বড় টেবিলগুলির জন্য এটি আপনার অভিনয়কে মেরে ফেলবে
ইলমাজহুসেইন

8

অ্যাক্টিভ_ন একটি তারিখ অবজেক্ট ধরে নেওয়া, এটি 1 দিন বাড়িয়ে তারপরে পরিসীমা বাড়ান

next_day = active_on + datetime.timedelta(1)
queryset = queryset.filter(date_created__range=(active_on, next_day) )

2

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

datetime_filter = datetime(2009, 8, 22) 
MyObject.objects.filter(datetime_attr__startswith=datetime_filter.date())

এটি নিম্নলিখিত কোয়েরি সম্পাদন করবে:

SELECT (values) FROM myapp_my_object \ 
WHERE myapp_my_object.datetime_attr LIKE BINARY 2009-08-22%

এই ক্ষেত্রে লাইক বাইনারি তারিখের সাথে সমস্ত কিছু মিলবে, টাইমস্ট্যাম্প যাই হোক না কেন। এর মতো মান সহ:

+---------------------+
| datetime_attr       |
+---------------------+
| 2009-08-22 11:05:08 |
+---------------------+

আশা করি জঙ্গো সমাধান না নিয়ে আসা পর্যন্ত এটি সকলকে সহায়তা করে!


ঠিক আছে, সুতরাং এটি উপরে mhost এবং কেটেলহেল হিসাবে একই উত্তর বলে মনে হচ্ছে, কিন্তু ব্যাকএন্ডে কী ঘটছে তার আরও বিবরণ সহ। কমপক্ষে আপনার তারিখের তারিখ () বৈশিষ্ট্য সহ অন্তর্ভুক্ত বা শুরু সহ ব্যবহার করার কোনও কারণ আছে!
bbengfort

2

একটি দুর্দান্ত ব্লগপোস্ট রয়েছে যা এটি এখানে জুড়েছে: জ্যাঙ্গো ওআরএমের তারিখ এবং তারিখের সাথে তুলনা করে

জ্যাঙ্গো> 1.7, <1.9 এর জন্য পোস্ট করা সেরা সমাধানটি ট্রান্সফর্মটি রেজিস্ট্রেশন করতে হবে:

from django.db import models

class MySQLDatetimeDate(models.Transform):
    """
    This implements a custom SQL lookup when using `__date` with datetimes.
    To enable filtering on datetimes that fall on a given date, import
    this transform and register it with the DateTimeField.
    """
    lookup_name = 'date'

    def as_sql(self, compiler, connection):
        lhs, params = compiler.compile(self.lhs)
        return 'DATE({})'.format(lhs), params

    @property
    def output_field(self):
        return models.DateField()

তারপরে আপনি এটি আপনার ফিল্টারগুলিতে এটি ব্যবহার করতে পারেন:

Foo.objects.filter(created_on__date=date)

সম্পাদনা

এই সমাধানটি অবশ্যই ব্যাক এন্ড নির্ভরশীল। নিবন্ধ থেকে:

অবশ্যই, এই বাস্তবায়ন আপনার এসকিউএল এর একটি নির্দিষ্ট তারিখের () ফাংশনের উপর নির্ভর করে। মাইএসকিউএল করে। এসকিউএলাইটও তাই করে। অন্যদিকে, আমি ব্যক্তিগতভাবে পোস্টগ্রাএসকিউএল এর সাথে কাজ করি নি, তবে কিছু গুগলিং আমাকে বিশ্বাস করতে পরিচালিত করে যে এটির কোনও তারিখ () ফাংশন নেই। সুতরাং একটি বাস্তবায়ন এই সহজ বলে মনে হচ্ছে এটি অগত্যা কিছুটা ব্যাকএন্ড নির্ভর।


এটি কি মাইএসকিউএল নির্দিষ্ট? ক্লাস নাম পছন্দ সম্পর্কে ভাবছি।
বিনোজ ডেভিড

@ বিনোজডাভিড হ্যাঁ, এটি ব্যাকএন্ড নির্ভর
ড্যান গেইল

আমি এটি জ্যাঙ্গো 1.8 এবং পোস্টগ্রেএসকিউএল 9.6.6 ব্যবহার করে পরীক্ষা করেছি এবং এটি পুরোপুরি কার্যকর হয়। প্রকৃতপক্ষে PostgreSQL ব্যবহার করে আপনি এই বাক্য return '{}::date'.format(lhs), params
গঠনটিও

1

এইচএম .. আমার সমাধান কাজ করছে:

Mymodel.objects.filter(date_time_field__startswith=datetime.datetime(1986, 7, 28))


0

জাজানোতে ১.7..6 কাজ করেছে:

MyObject.objects.filter(datetime_attr__startswith=datetime.date(2009,8,22))

2
এটি কেবল তখনই কাজ করে যদি আপনি সঠিক তারিখটি সন্ধান করেন, আপনি __lteউদাহরণস্বরূপ ব্যবহার করতে পারবেন না ।
guivial

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