2017-01-09 5 views
1

장고 앱에서 데이터를 수정하는 스크립트가 있습니다. Excel에서 데이터를 처리하고 모델을 업데이트하고 일부 데이터는 아랍어로 표시되며 실행시python/django에서 아랍어 문자 인쇄하기

Traceback (most recent call last): 

    File "script.py", line 77, in <module> 

    update_locations(path) 

    File "script.py", line 36, in update_locations 

    household.location = new_location 

    File "/data/envs/ve.maidea/lib/python2.7/site-packages/django/db/models/fields/related_descriptors.py", line 207, in __set__ 

    self.field.remote_field.model._meta.object_name, 

ValueError: Cannot assign "'\xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd9\x8a\xd8\xb1\xd9\x87'": "Household.location" must be a "Location" instance. 

내가 오류가이 아랍어 문자에 의해 제기 된 생각 : 스크립트 나는 다음과 같은 오류가 발생합니다. 내가 친절하게 사전에이 아랍어 characters.Thanks을 인쇄하는 가장 좋은 방법에 대한 조언이 필요

import django 
django.setup() 

import sys 
reload(sys) # to re-enable sys.setdefaultencoding() 
sys.setdefaultencoding('utf-8') 

import xlrd 
from django.db import transaction 
from foodnet.apps.registration.models import Household 
from geo.models import Location 

log_file = "/opt/cv_instances/cv1/autodeploy/branches/nboreports/maidea/egypt/data_import_files/egypt_beheira_locations.txt" 
logfile_to_write = open(log_file, "w") 

def process_file(path): 
    book = xlrd.open_workbook(path) 
    print("Got {0} number of sheets.".format(book.nsheets)) 

    hh_counter = 0 

    for sheet_num in range(book.nsheets-1, -1, -1): 
     sheet = book.sheet_by_index(sheet_num) 
     print("Processing sheet number {0} ({1})".format(sheet_num, sheet.name)) 
     for row_idx in range(1, sheet.nrows): 
      with transaction.atomic(): 
       try: 
        household_name = str(sheet.row_values(row_idx)[0]).strip().replace(".0","") 
        # old_location = str(sheet.row_values(row_idx)[1]).strip().replace(".0","") 
        new_location = str(sheet.row_values(row_idx)[2]).strip().replace(".0","") 

        if household_name: 
         household = Household.objects.get(office__slug='eg-co',name=household_name) 
         # print(household.name, household.location) 
         #update new locations 
         household.location = new_location 
         household.save() 
         hh_counter += 1 

         logfile_to_write.write("Household {0} updated to location {1}".format(household, household.location)) 
       except Household.DoesNotExist: 
        continue 
    print("Done looping and updating locations") 
    print("================================================================================================================================") 

def delete_old_locations(path): 
    """ 
    Delete old locations no longer needed by the country office 
    """ 
    book = xlrd.open_workbook(path) 
    print("Got {0} number of sheets.".format(book.nsheets)) 

    location_counter = 0 

    for sheet_num in range(book.nsheets-1, -1, -1): 
     sheet = book.sheet_by_index(sheet_num) 
     print("Processing sheet number {0} ({1})".format(sheet_num, sheet.name)) 
     for row_idx in range(1, sheet.nrows): 
      with transaction.atomic(): 
       try: 
        old_location = str(sheet.row_values(row_idx)[1]).strip().replace(".0","") 
        if old_location: 
         location = Location.objects.get(country__name="Egypt", name=old_location) 
         # print(location.name, location.country) 
         location.delete() 
         location_counter += 1 
         logfile_to_write.write("Location {0} deleted ".format(location)) 
       except Location.DoesNotExist: 
        continue 
    print("Done looping and deleting locations") 
    print("================================================================================================================================") 


#call the our process file method 
if __name__=="__main__": 
    path = "/opt/cv_instances/cv1/autodeploy/branches/nboreports/maidea/egypt/data_import_files/egypt-sf-beheira-enrolments.xlsx" 
    process_file(path) 
    delete_old_locations(path) 
    print("Done processing file") 

:

여기 내 스크립트입니다.

+1

분명히 household.location은 Location 모델에 대한 ForeignKey이므로 그냥 문자열로 지정할 수는 없습니다. 문자열이 아랍어로되어 있다는 것은 해당 오류와 관련이 없습니다. – RemcoGerlich

답변

2

아랍어 문자와는 아무런 관련이 없습니다. 오류가 말했듯이 문자열이 아닌 위치의 인스턴스를 지정해야합니다.

+0

고마워, 내가 어디에 문제가 고맙다고 생각해 봤어. –