2014-07-17 24 views
9

साथ छनन DateTimeField पर मैं एक DateTimeField के साथ एक मॉडल हैDjango बाकी फ्रेमवर्क

class ShellMessageFilter(django_filters.FilterSet): 
    created = django_filters.DateTimeFilter(name="created",lookup_type="gte") 

    class Meta: 
     model = ShellMessage 
     fields = ['created'] 


class ShellListViewSet(viewsets.ModelViewSet): 
    """ 
     List all ShellMessages 
    """ 
    serializer_class = ShellMessageSerializer 
    queryset = ShellMessage.objects.all() 
    filter_class = ShellMessageFilter 

जब मैं का उपयोग कर मेरी एपीआई मारा निम्नलिखित यूआरएल यह पूरी तरह से काम करता है:

http://127.0.0.1:8000/api/shell/?created=2014-07-17 
# It returns all shell with a date greater than the one provided in URL 

लेकिन, मैं उस डेटा पर आधार फ़िल्टर करके उससे अधिक करना चाहता हूं ई और एक समय। मैं सफलता के बिना निम्न URL की कोशिश की:

http://127.0.0.1:8000/api/shell/?created=2014-07-17T10:36:34.960Z 
# It returns an empty array whereas there are items with a created field greater than 2014-07-17T10:36:34.960Z 

तुम लोगों को पता है आगे बढ़ने के लिए कैसे ... मैं किसी भी अच्छी जानकारियां या Django-फिल्टर दस्तावेज में उदाहरण नहीं मिलता है ...

+0

क्या आप इस यूआरएल को आजमा सकते हैं: http://127.0.0.1:8000/api/shell/?created=2014-07-17%2010:36:34.960? – AdelaN

+0

मुझे लगता है कि मैं इस मामले में हूं: https://github.com/tomchristie/django-rest-framework/issues/1338 –

+0

पहला व्यक्ति यूआरएल से टी को हटाने का सुझाव देता है, तो शायद यह आपके लिए भी काम करेगा । – AdelaN

उत्तर

2

यह नहीं हो सकता जो भी आप चाहते हैं, लेकिन आप बस यूनिक्स समय से बदल सकते हैं। उदा .:

def filter_unix_dt(queryset, value): 
    if not value: 
     return queryset 

    try: 
     unix_time = int(value) 
     t = datetime.fromtimestamp(unix_time) 
     result = queryset.filter(created__gte=t) 
     return result 
    except ValueError: 
     return queryset 


class ShellMessageFilter(django_filters.FilterSet): 
    created = django_filters.DateTimeFilter(action=filter_unix_dt) 

    class Meta: 
     model = ShellMessage 
     fields = ['created'] 
+0

बहुत बढ़िया उत्तर, लेकिन django_filter को डेटटाइमफ़िल्टर के बजाय चारफ़िल्फ़ होना चाहिए: "बनाया गया = django_filters.CharField (action = filter_unix_dt)" – OriolJ

2

सरल समाधान अगर आप सेकंड के अंशों के बारे में परवाह नहीं है: अंतरिक्ष के साथ "टी" की जगह (20%):

http://127.0.0.1:8000/api/shell/?created=2014-07-17%2010:36:34 

मेरे लिए काम किया।

1

मुद्दा और समाधान इस डीआरएफ मुद्दा पेज में दर्ज कर रहे हैं: https://github.com/tomchristie/django-rest-framework/issues/1338

टी एल; डॉ: एक Django आईएसओ रूपांतरण 'मुद्दा' में काम कर रहे, जैसा कि आप उम्मीद कर रहे हैं से डीआरएफ रोक रहा है। इसके लिए एक फिक्स डीआरएफ में लिखा गया है, जिससे आप DateTimeField के बजाय IsoDateTimeField का उपयोग कर सकते हैं। आपके अनुरोध में एक स्थान के साथ बस T को फिर से चलाएं param param भी काम करता है।

संबंधित मुद्दे