2013-06-26 6 views
19

मैं एक ऐप बना रहा हूं जो दुनिया भर के विभिन्न स्थानों में स्थित लोगों की सेवा करेगा।
मैं ग्राहकों और सर्वर के बीच संचार के लिए Django-Rest-Framwork का उपयोग कर रहा हूं।
सभी डेटटाइम मान डीबी में यूटीसी के रूप में सहेजे जाते हैं (मेरे पास USE_TZ = True और TIME_ZONE = 'Greenwich' सेटिंग्स.py में हैं)।Django-rest-framework timezone जागरूक renderers/पार्सर्स

मैं उपयोगकर्ता से अपने स्थानीय टाइमज़ोन प्राप्त कर रहा हूं।

import pytz 
from django.utils import timezone 

class TimezoneMiddleware(object): 
    def process_request(self, request): 
     timezone.activate(pytz.timezone("Asia/Jerusalem")) 

समस्या है::

करने के लिए परीक्षण समय क्षेत्र जागरूकता के लिए डीआरएफ मैं निश्चित समय क्षेत्र के साथ इस मिडलवेयर लिखा
मैं एक मामला है जिसमें मैं उपयोगकर्ता "start_time" से हो रही है है और उपयोगकर्ता के LOCAL टाइमज़ोन में UnicodeJSONRenderer से ModelSerializer पर और फिर डीबी में सहेजा गया "end_time" फ़ील्ड डेटाटाइम को शामिल करता है। हालांकि, वे सहेजे गए हैं जैसे कि वे यूटीसी में थे।

इस बिंदु पर मैं सीरियलाइज़र (या पार्सर) को डेटाटाइम इनपुट के रूप में उपयोगकर्ता से डेटाटाइम इनपुट के रूप में व्यवहार करने की अपेक्षा करता हूं, जिसे डीबी में सहेजने से पहले "एशिया/जेरूसलम" से यूटीसी में परिवर्तित करने की आवश्यकता होती है क्योंकि मैंने timezone.activate(pytz.timezone("Asia/Jerusalem")) किया था।

वही तब होता है जब डेटा JSONParser के माध्यम से प्रतिक्रिया में वापस पार्स किया जाता है।
लौटे हुए जेएसओएन में डेटटाइम फ़ील्ड्स को मिडलवेयर में सक्रिय टाइमज़ोन में होने की उम्मीद करते समय, वे यूटीसी के रूप में वापस आते हैं।

मैं डीआरएफ में आसानी से इसे कैसे प्राप्त कर सकता हूं?

+0

आप एक मिला संस्करणों (आम/serializers.py) के साथ काम करने के लिए इसे अपडेट करने के बाद पुन: पोस्ट कर रहा हूँ उपाय? – yakxxx

+0

@yakxxx - दुर्भाग्य से अभी तक नहीं। अभी के लिए मैं जीएमटी में डेटाटाइम वैल्यू प्राप्त करता हूं और वापस देता हूं और स्थानीय टाइमज़ोन में रूपांतरण क्लाइंट के पक्ष में किया जाता है। – OrPo

+0

क्या आप एक अनुरोध पोस्ट कर सकते हैं? मुझे आश्चर्य है कि आपने JSON के अंदर किस प्रारूप का उपयोग किया था? क्या आप एक टाइमज़ोन जागरूक आईएसओ 8601 स्ट्रिंग का उपयोग कर रहे हैं? – codingjoe

उत्तर

31

मैं एक ही समस्या थी और मैदान के नए प्रकार जोड़कर इसे हल:

class DateTimeTzAwareField(serializers.DateTimeField): 

    def to_native(self, value): 
     value = timezone.localtime(value) 
     return super(DateTimeTzAwareField, self).to_native(value) 

और अब आप ModelSerializer में इसका इस्तेमाल कर सकते हैं:

class XSerializer(serializers.ModelSerializer): 
    start = DateTimeTzAwareField() 
    end = DateTimeTzAwareField() 

    class Meta: 
     model = XModel 
     fields = (
      'id', 
      'start', 
      'end', 
     ) 
+3

एक छोटा फिक्स - यदि यह फ़ील्ड शून्य भी हो सकता है, तो एक साधारण चेक की आवश्यकता होती है, उदाहरण के लिए: 'यदि मान: value = timezone.localtime (value)' – Ophir

+4

नई Django-Rest-Framework, इसके बजाय 'to_representation' का उपयोग करें 'to_native' – db0

+0

एक आकर्षण की तरह काम करता है, धन्यवाद! –

14

@yakxxx द्वारा जवाब हो रहा है सबसे अच्छा समाधान। मैं नए restframework

की मेरी निर्देशिका के अंदर

from rest_framework import serializers 
from django.utils import timezone 

class DateTimeFieldWihTZ(serializers.DateTimeField): 

    def to_representation(self, value): 
     value = timezone.localtime(value) 
     return super(DateTimeFieldWihTZ, self).to_representation(value) 

अपने आवेदन के अंदर

from common.serializers import DateTimeFieldWihTZ 

class MyObjectSerializer(serializers.ModelSerializer): 

    start = DateTimeFieldWihTZ(format='%d %b %Y %I:%M %p') 
    end = DateTimeFieldWihTZ(format='%d %b %Y %I:%M %p') 
+0

ओफिर द्वारा सुझाए गए अनुसार कोई भी मूल्य जांचने की आवश्यकता नहीं है। स्पष्ट रूप से यदि मूल्य कोई नहीं है तो इस विधि को कभी भी – Ramast

+0

नहीं कहा जाएगा, क्या मैं 'DEFAULT_DATETIME_PARSER = 'common.serializers सेट कर सकता हूं। DateTimeFieldWihTZ 'सभी डेटाटाइफ़ फ़ील्ड को डेटटाइमफ़िल्ल्ड WihTZ में बदलने के लिए? – kxxoling

+1

मुझे उस नाम के साथ किसी भी बाकी फ्रेमवर्क सेटिंग के बारे में पता नहीं है – Ramast

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