2016-04-26 10 views
-1

Objを関数に渡したときに、Obj.date_timeオブジェクトがIST datetime-stringに変換されているdjangoのこの奇妙な問題に直面しています。また、ログに基づいてしかほとんどケースがないことが起こっています。Django DateTimeは自動的にIST文字列に変換されます

#Actual Call 
status_time_dict = {4: [orderObj.pickup_time,'dispatch_time'], 
        5: [orderObj.delivered_time,'delivery_time']} 

statusVar = status_time_dict.get(int(orderObj.status), [timezone.now(),"Undefined"]) 

statusDate = buildDateString(statusVar[0],orderObj, date_format_type = 0,convert_to_ist = 0) 
----------------------------------------------------------------------- 

class Order(models.Model): 
    name = models.CharField(max_length=100, blank=True) 
    house_number = models.CharField(max_length=255) 
    contact_number = models.CharField(max_length=13) 
    order_date = models.DateField(db_index=True) 
    order_time = models.DateTimeField(db_index=True) 
    pickup_time = models.DateTimeField(null=True) 
    delivered_time = models.DateTimeField(null=True) 

    def get_order_time(self): 
     if self.order_time: 
      return str(self.order_time.replace(tzinfo=None) + datetime.timedelta(minutes=330)) 
     else: 
      return "not available" 

    def get_pickup_time(self): 
     if self.pickup_time: 
      return str(self.pickup_time.replace(tzinfo=None) + datetime.timedelta(minutes=330)) 
     else: 
      return "not available" 

    def get_delivered_time(self): 
     if self.delivered_time: 
      return str(self.delivered_time.replace(tzinfo=None) + datetime.timedelta(minutes=330)) 
     else: 
      return "not available" 

def utc_to_local(utc_dt): 
    local_tz = pytz.timezone('Asia/Kolkata') 
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz) 
    return local_tz.normalize(local_dt) 


def buildDateString(statusDate,Obj, date_format_type = 1,convert_to_ist = 1): 
    if statusDate is None: 
     statusDate = timezone.now() 

    elif type(statusDate) in [str, unicode]: 
    # **This is where it is failing, it should not have ben str or  
    # unicode as statusDate is being passed as OBJECT 
    # OBJ.DATE_TIME should never been a string but is happeing for few 
    # cases only and that too in Prod server only.** 
     failing_date = {"OID": Obj.id, "status_order": Obj.status, "failingDateString": statusDate, 
      'pickup_time': Obj.pickup_time, 'allot_time': Obj.allot_time, 'delivered_time': Obj.delivered_time} 

     print failing_date 
     try: 
      date_format = {True:"%Y-%m-%dT%H:%M:%S.%fZ", False:"%Y-%m-%d %H:%M:%S"} 
      format = date_format.get('Z' in statusDate,"Y-%m-%d %H:%M:%S") 
      statusDate = datetime.datetime.strptime(statusDate, format) 
      if date_format_type == 1: 
       return statusDate.strftime('%d-%m-%Y %H:%M:%S') 
      else: 
       return statusDate.strftime('%Y-%m-%d %H:%M:%S') 
     except ValueError: 
      statusDate = timezone.now() 
    if convert_to_ist ==1: 
     statusDate = utc_to_local(statusDate) 
    if date_format_type == 1: 
     statusDate = (statusDate).strftime('%d-%m-%Y %H:%M:%S') 
    else: 
     statusDate = (statusDate).strftime('%Y-%m-%d %H:%M:%S') 
    return statusDate 

PLSが起こっているバグの詳細については、のelif内のコメントを参照してください。

私のmodels.pyには、IST文字列に変換するget_COLUMN_NAME関数が定義されていますが、このコンテキストでは呼び出されていません。私はそれが上記の奇妙な行動の理由であるかどうか疑問に思う。

+1

あなたのケースで「ISTに変換されました」とはどういう意味ですか?デバッガを実行して 'Obj.date_time'が"変換された "場所を見つけます(' print(repr(Obj.date_time)) '行が"変換された "行の後にOKです)不必要なコードなしで問題を示すために – jfs

答えて

0

orderObjの出所を確認する必要がある。おそらく、データベースからオブジェクトをフェッチした後、このオブジェクトのdatetimeフィールドを変更するコードがあります。

+0

get call経由で来ています - Order.objects.get(id = Some_ID) – Rohit

関連する問題