2016-08-25 70 views
1

我有一个模型保存从Excel文件导入的数据。 我想防止有重复的条目,它会检查已经存在的数据,看看它们是否匹配。防止添加重复的数据从Excel格式导入到db

我的模型

from django.db import models 


class UserData(models.Model): 
    GENDER_CHOICES = (
     ('Male', 'Male'), 
     ('Female', 'Female'), 
    ) 

    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    age = models.IntegerField() 
    gender = models.CharField(default='Male', choices=GENDER_CHOICES, max_length=6) 
    address = models.CharField(max_length=200) 

    class Meta: 
     verbose_name_plural = 'User Data' 

    def __str__(self): 
     return self.fullname() 

views.py

class UploadFileForm(forms.Form): 
    file = forms.FileField() 


def import_data(request): 
    if request.method == "POST": 
     form = UploadFileForm(request.POST, 
          request.FILES) 
     if form.is_valid(): 
      request.FILES['file'].save_to_database(
       name_columns_by_row=2, 
       model=UserData, 
       mapdict=['first_name', 'last_name', 'age', 'gender', 'address']) 


     return HttpResponse("OK") 
    else: 
     return HttpResponseBadRequest() 
else: 
    form = UploadFileForm() 
return render_to_response('excel/upload_form.html', 
          {'form': form}, 
          context_instance=RequestContext(request)) 

我尝试使用unique_together,并试图重写形式cleaned_data,但仍然无法阻止被添加到数据库副本。

什么是最好的方法来实现这一目标?感谢

+0

你在哪里得到一个KeyError? –

+0

目前没有。但是,当我尝试覆盖clean_data时,我得到了KeyError,说明“first_name”在它明确的时候不存在。 –

+1

什么是最好的方法来解决这个问题? –

回答

2

1.创建一个模型形式

class UserDataForm(forms.ModelForm): 
    // code here 
    class Meta: 
     model = UserData 

2.使用使excel表数据字典的格式。

from pandas import * 
xls = ExcelFile('path_to_file.xls') 
df = xls.parse(xls.sheet_names[0]) 

ref:Python Creating Dictionary from excel data

3.用字典数据实例化模型并检查验证。如果数据是针对相同或使用Django model_name.get_or_create()

form = UploadFileForm(request.POST, 
         request.FILES) 
    if form.is_valid(): 
     # code here to convert to dictionary 
     data = data_in_dict_form 
     user_data_form = UserDataForm(data=data) 
     if user_data_form.is_valid(): 
      obj, created = UserData.objects.get_or_create(**user_data_form.cleaned_data) 
      # this will create new entry if doesnt exist and just get from db if already exist. 
      # You can ause any method to create an entry to the data base. you can also just .filter().exists() to check if there is an existing entry. if It returns True you dont need to save it. 
      # Your Response 
     else: 
      # your Response 

注意分贝入出境有效的检查:如果有多个行,每行是在DB独立的条目。你需要循环每一行并验证并保存()/ Do_not_save。 :)

我希望这会帮助你解决问题。