2016-12-25 13 views
1

django에서 F() 객체를 사용하여 모델의 자체 datetime 필드를 업데이트하려고합니다. 이 작업을 수행 할 때Django - F ('datetimefield') + relativedelta (months = 1)이 실패했습니다.

HeatWatchList.objects.filter(
    user=request.user, 
    next_date_to__lt=datetime.combine(datetime.now().date(), time.min) 
).update(
    next_date_from = F('next_date_from') + relativedelta(months=1), 
    next_date_to = F('next_date_to') + relativedelta(months=1) 
) 

는하지만 난 AttributeError: relativedelta object has no attribute translate을 얻었다.

여기에 코드를 실행할 때 traceback이 있는데 datetime 유형 relativedelta로 값을 추가 할 때 F() 객체를 사용하는 문제가있을 수 있습니다.

Traceback (most recent call last): 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\core\handlers\exception.py", line 39, in inner 
    response = get_response(request) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\rest_framework\viewsets.py", line 83, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\rest_framework\views.py", line 477, in dispatch 
    response = self.handle_exception(exc) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\rest_framework\views.py", line 437, in handle_exception 
    self.raise_uncaught_exception(exc) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\rest_framework\views.py", line 474, in dispatch 
    response = handler(request, *args, **kwargs) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\farm_management\heat\views.py", line 192, in update_watchlist 
    next_date_to = F('next_date_to') + relativedelta(months=1) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\db\models\query.py", line 637, in update 
    rows = query.get_compiler(self.db).execute_sql(CURSOR) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\db\models\sql\compiler.py", line 1148, in execute_sql 
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\db\models\sql\compiler.py", line 835, in execute_sql 
    cursor.execute(sql, params) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\db\backends\utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\db\backends\utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\django\db\backends\mysql\base.py", line 110, in execute 
    return self.cursor.execute(query, args) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\cursors.py", line 164, in execute 
    query = self.mogrify(query, args) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\cursors.py", line 143, in mogrify 
    query = query % self._escape_args(args, conn) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\cursors.py", line 118, in _escape_args 
    return tuple(conn.literal(arg) for arg in args) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\cursors.py", line 118, in <genexpr> 
    return tuple(conn.literal(arg) for arg in args) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\connections.py", line 800, in literal 
    return self.escape(obj, self.encoders) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\connections.py", line 793, in escape 
    return escape_item(obj, self.charset, mapping=mapping) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\converters.py", line 27, in escape_item 
    val = encoder(val, mapping) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\converters.py", line 110, in escape_unicode 
    return u"'%s'" % _escape_unicode(value) 
    File "C:\Users\Web\Desktop\PyDev\Envs\djangular\lib\site-packages\pymysql\converters.py", line 73, in _escape_unicode 
    return value.translate(_escape_table) 
AttributeError: 'relativedelta' object has no attribute 'translate' 
+0

는 그 코드가 당신에게 그 오류를 제공하지 않습니다 한 가지 가능한 솔루션은 객체를 반복하고 (비효율적)를 업데이트하는 것입니다. 완전한 추적과 함께 전체 코드를 보여줍니다. –

+0

잠시만 기다려주십시오. –

+0

@DanielRoseman 방금 추적 질문으로 내 질문을 업데이트했습니다. –

답변

1

pymysql의 변환기 does not support relativedelta 개체와 같습니다.

objects_list = HeatWatchList.objects.filter(
user=request.user, 
next_date_to__lt=datetime.combine(datetime.now().date(), time.min) 
) 

for obj in object_list: 
    obj.next_date_from = onj.next_date_from + relativedelta(months=1) 
    obj.next_date_to = onj.next_date_to + relativedelta(months=1) 
    objsave() 

또는보다 효율적으로 사용 datetime.timedelta 대신 relativedelta를 가능이있는 경우 :

HeatWatchList.objects.filter(
user=request.user, 
next_date_to__lt=datetime.combine(datetime.now().date(), time.min) 
).update(
next_date_from = F('next_date_from') + timedelta(days=31), 
next_date_to = F('next_date_to') + timedelta(days=31) 
) 
+0

anwer를 주셔서 고마워하지만, 나는 그 timedelta doesnt 정확한 datetime 값을 양보하고 많은 대신 relativedelta 사용하는 것이 좋습니다 사실입니까? 감사! –

+0

하지만 pymysql이이 기능을 지원합니다. 그런 유용한 기능을 어떻게 남겨 둘 수 있을까요? –

+0

@ ShiftN'Tab 네, 그렇습니다. 예를 들어 timedelta를 월로 설정할 수는 없지만 옵션으로 일만 남았습니다. 하지만 다른 해결책을 보지 못합니다. ( – neverwalkaloner