Django 시트 업로드

15070 단어 djangobatchexcel
우리가 작업한 대부분의 프로젝트에는 일괄적으로 데이터를 업로드하는 기능이 필요했습니다. 우리는 항상 Excel 시트를 처리하고 각 열이 각 모델로 이동하는 다른 코드를 작성했습니다. 최신 프로젝트에서 우리는 그것을 다르게 처리하기로 결정했고 ModelForm이 모델을 처리하는 것처럼 이것을 처리하는 django 앱을 작성한 이유는 놀랍게도 작동했습니다.

특징


  • Django 모델 또는 모델 조합에서 시트 생성(결합된 시트를 통해),
  • Excel에서 선택 사항, 외래 키, 정수에 대한 유효성 검사 규칙을 자동으로 추가합니다.
  • 기본적으로 필수 필드를 빨간색으로 표시함
  • 시트를 자동으로 검증하고 is_valid()로 확인할 수 있습니다.
  • 클래스에서 모델의 동작 재정의 허용,
  • 많은 함수가 클래스 동작을 재정의하도록 허용합니다( row_preprocess , save , pre_load , post_process ),
  • 시트의 데이터를 모델에 자동으로 로드합니다.

  • 설치


  • 패키지 설치

  • pip install django-batch-sheet
    


  • INSTALLED_APPS에 추가

  • INSTALLED_APPS=[
    ...
    'batch_sheet'
    ...
    ]
    


    예시



    이러한 규칙을 가진 다음 모델이 있다고 가정해 보겠습니다.
  • 환자는 여러 테스트를 가질 수 있지만 한 번은 Patient 개체로 저장됩니다.

  • class Test(models.Model):
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    
    class Gender (models.Model):
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    class Patient(models.Model):
        name = models.CharField(max_length=50,verbose_name="Patient Name")
        MRN = models.CharField(max_length=50)
        gender= models.ForeignKey(Gender,on_delete=models.PROTECT,null=True, verbose_name="Gender")
        date_of_birth = models.DateField(null=True,blank=True,verbose_name="Birth Date")
        date_admitted = models.DateField(auto_now_add=True,auto_created=True)
        lastUpdate = models.DateTimeField(auto_now=True)
    
    
    class RequestedTest(models.Model):
        patient = models.ForeignKey(Patient,on_delete=models.CASCADE)
        test = models.ForeignKey(Test,on_delete=models.PROTECT,verbose_name="Test")
        sample_date = models.DateField(auto_now_add=True,auto_created=True)
        sample_type = models.CharField(max_length=50, verbose_name="Sample Type",choices=(('Blood','Blood'),('DNA','DNA')))
        lastUpdate = models.DateTimeField(auto_now_add=True)
    


    두 모델을 시트에 결합하려고 하므로 요청된 테스트와 함께 환자 정보를 한 행에 넣습니다.

    따라서 환자를 위해 클래스PatientSheet를 다음과 같이 구현합니다.

    class PatientSheet(Sheet):
        def save(self, obj:Patient, row_objs:dict):
            """Lets handle the save manually to check if the MRN exists"""
            patient = Patient.objects.filter(MRN = obj.MRN)
            if patient.exists():
                p = patient[0]
            else:
                p = obj
                p.save()
            return p
        class Meta:
            exclude=('id','date_admitted','lastUpdate')
            Model = Patient
            obj_name = "patient"
            title_header = True
    


    메타 속성의 경우 메타 속성 섹션으로 이동하십시오.

    RequestedTest Sheet의 경우 다음과 같이 진행됩니다.

    class RequestedTestSheet(Sheet):
        def save(self,obj,row_objs):
            patient = row_objs.get('patient')
            if patient is None:
                return None
            else:
                obj.patient = patient
                obj.save()
                return obj
    
        class Meta:
            exclude =('id','sample_date','lastUpdate')
            validation_exclude = ('patient',)
            title_header = True
            Model = RequestedTest
    


    이제 하나의 시트로 합칠 수 있습니다.

    class TestSheet(CombinedSheet):
        patient = PatientSheet()
        test = RequestedTestSheet()
    


    이제 시트를 생성해 보겠습니다.

    $ python manage.py generate_sheet --xls App.xls --sheet test_app.sheets.TestSheet
    


    그러면 폴더의 App.xls에 파일이 저장됩니다. 이제 App.xls를 열 수 있습니다.



    데이터베이스의 값에 따라 드롭다운이 자동으로 표시됩니다.

    메타 옵션




        Class Meta:
            rows_count = 10              # Number of rows to apply validations on
            columns = ()                 # Columns to add from the Model to the sheet
            exclude = ()                 # Columns to exclude
            Model = None                 # Model to scan
            raw_cols = []                # Foreign Key Field that shouldn't be set as dropdown
            title_header = False         # Make the titles as "First Name"
            validation_exclude=[]        # Don't validate these field, important in case of objects relationship  
            object_name = None           # The name of the object saved, important in case of Combined Sheet.
    
    
    

    좋은 웹페이지 즐겨찾기