Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Probleme d'ajout des donnees dans les tables de ma base de donnees

0 votes

Mon script ne parvient pas a rentrer les donnees du fichier .dcm dans mes tables.

import os, pydicom
from django.core.management.base import BaseCommand, CommandError
from data_base.models import Group, Tag, User, Feed, Patient, Study, Data, Series, MR_Params, US_Params, CT_Params, Review, Token





class Command(BaseCommand):
    help = 'that does my stuff'


    def handle(self, *args, **options):

       for dossier, sous_dossiers, fichiers in os.walk('/neuro/users/chris/data'):
           for fichier in fichiers:
               fullpath = os.path.join(dossier, fichier)

               print(fullpath)
               try:
                  ds = pydicom.read_file(fullpath)


                  ############# Study table ##############
                  try:
                      b = Study(Name=ds.Name, Pathology=ds.Pathology, StationName=ds.StationName,
                       ManufacturerModelName=ds.ManufacturerModelName, BodyPartExaminated=ds.BodyPartExaminated,
                        MagneticFieldStrength=ds.MagneticFieldStrength, Modality=ds.Modality, StudyInstanceUID=ds.StudyInstanceUID)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')



                      #############  table ##############


                  try:
                      b = Patient(PatientName=ds.PatientName, StudyInstanceUID=ds.StudyInstanceUID, PatientBirthdate=ds.PatientBirthdate, PatientAge=ds.PatientAge, PatientId=ds.PatientId)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')




                      ############# Series table ##############


                  try:
                      b = Series( Name=ds.Name, SeriesName=ds.SeriesName, SeriesInstanceUID=ds.SeriesInstanceUID, ProtocolName=ds.ProtocolName)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')





                      ############# MR_Params table ##############



                  try:
                      b = MR_Params(Name=ds.Name, SliceThickness=ds.SliceThickness, EchoTime=ds.EchoTime, InversionTime=ds.InversionTime, RepetionTime=ds.RepetionTime)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')



                      ############# US_Params table ##############

                  try:
                      b = US_Params(Name=ds.Name)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')


                       ############# CT_Params table ##############

                  try:
                      b = CT_Params(Name=ds.Name)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')



                      ############# Data table ##############

                  try:
                      b = Data(Name=ds.Name, Description=ds.Description, Time=ds.Time, NbFiles=ds.NbFiles, Progress=ds.Progress)
                      b.save()

                  except NameError:
                      print('not possible to know this information')
                  except AttributeError:
                      print('not possible to know this information')



               except pydicom.errors.InvalidDicomError:
                       print('not possible to know this information')

Sachant que mon model.py est le suivant : ( tous les champs du model ne sont pas encore visibles dans mon fichier closepoll.py)

#-*- coding: utf-8 -*-

from django.db import models

class Group(models.Model):
    Name = models.CharField(max_length=200,null=False)

    def __str__(self):
        return self.Name


class Tag(models.Model):
    Name = models.CharField(max_length=200,null=False)
    Color = models.CharField(max_length=200,null=False)

    def __str__(self):
        return self.Name


class User(models.Model):
    Name = models.CharField(max_length=200,null=False)
    Password = models.CharField(max_length=200,null=False)
    Email = models.EmailField(max_length=200,null=False)
    group = models.ManyToManyField(Group)

    def __str__(self):
        return self.Name





class Patient(models.Model):
    PatientName = models.CharField(max_length=200)
    PatientSex = models.CharField(max_length=200)
    PatientBirthdate = models.DateField()
    PatientAge = models.IntegerField(default=0)
    PatientId = models.CharField(max_length=200)

    def __str__(self):
        return self.PatientName


class Study(models.Model):
    Name = models.CharField(max_length=200,null=False)
    Pathology = models.CharField(max_length=200,null=False)
    StationName = models.CharField(max_length=200,null=False)
    ManufacturerModelName = models.CharField(max_length=200,null=False)
    BodyPartExaminated = models.CharField(max_length=200)
    MagneticFieldStrength = models.IntegerField(default=0)
    Modality = models.CharField(max_length=200,null=False)
    StudyInstanceUID = models.CharField(max_length=200,null=False)
    patient = models.ForeignKey(Patient)

    def __str__(self):
        return self.Name


class Data(models.Model):
    Name = models.CharField(max_length=200,null=False)
    Description = models.CharField(max_length=200,null=False)
    Time = models.DateTimeField(auto_now=True,null=False)
    NbFiles = models.BigIntegerField(null=False)
    Progress = models.BigIntegerField(null=False)
    user = models.ManyToManyField(User)
    patient = models.ForeignKey(Patient)
    study = models.ForeignKey(Study)
    feed = models.ManyToManyField(Feed)

    def __str__(self):
        return self.Name


class Series(models.Model):
    Name = models.CharField(max_length=200,null=False)
    SeriesName = models.CharField(max_length=200,null=False)
    SeriesInstanceUID = models.CharField(max_length=200,null=False)
    ProtocolName = models.CharField(max_length=200,null=False)
    study = models.ForeignKey(Study)
    data = models.OneToOneField(Data)

    def __str__(self):
        return self.Name

.
.
.
.
.
etc

J'obtient la chose suivante dans ma console :

........................................./0122-1.3.12.2.1107.5.2.32.35201.2014101314125045331149835.dcm
not possible to know this information
not possible to know this information
not possible to know this information
not possible to know this information
not possible to know this information
not possible to know this information
not possible to know this information

Et lorsque je check mes tables il n'y a rien dedans.

demandé 1-Sep-2015 par YannMgl (170 points)
edité 1-Sep-2015 par bubulle

Pas de réponse (mais ca ressemble a un ou plusieurs import manquant), quelques conseils pour ton debug :

  • Vire tes except NameError et except AttributeError (tu n'es pas censé catch ces exceptions : ce sont des erreurs de programmation, pas des bugs) laisse péter ton programme, étudie la backtrace - au pire pose la ici.

  • Utilise pdb ou ipdb.

  • Si tu tiens vraiment a tes excepts, mets des messages explicites pour chaque cas d'erreur.

Ouai je vais garder les excepts parceque il n' y a pas toujours toutes les informations souhaitees dans le fichier .dcm.

Sinon en utilisant pdb j'ai remarque que aucunes de mes variables n'avaient de valeurs. Elles ne sont pas definies. Je dois mal m'y prendre lorsque je fais :

try:
    b = Patient(PatientName=ds.PatientName, StudyInstanceUID=ds.StudyInstanceUID, PatientBirthdate=ds.PatientBirthdate, PatientAge=ds.PatientAge, PatientId=ds.PatientId)
    b.save()

Ou autre try/except

je plussois @jc

+1 pr le "laisse peter"

ouai mais si je tire mes excepts je sais tres bien que ca va planter parceque tous les champs des fichiers dicom ne sont pas remplis. Du coup si pas d'infos pour ce champ je passe au suivant.

Sinon c'est bien de cette maniere qu'on remplie une table:

b = Patient(PatientName=ds.PatientName, StudyInstanceUID=ds.StudyInstanceUID, PatientBirthdate=ds.PatientBirthdate, PatientAge=ds.PatientAge, PatientId=ds.PatientId)
b.save()

Avec 'Patient 'ma table presente dans mon models.py et PatientName un attribut de cette classe Patient.

Alors, j'arrive a remplir mes tables, le probleme maintenant c'est les liens entre les differentes tables...
Par exemple:

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200, null=True)  
    question_text1 = models.CharField(max_length=200,null=True)
    question_text2 = models.CharField(max_length=200,null=True)
    question_text3 = models.CharField(max_length=200,null=True)

    def __str__(self):              # __unicode__ on Python 2
    return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

et ma commande perso :

import os, pydicom
from django.core.management.base import BaseCommand
from polls.models import Question, Choice

class Command(BaseCommand):
    help = 'that does my stuff'

    def handle(self, *args, **options):

       for dossier, sous_dossiers, fichiers in os.walk('/neuro/users/yann.mallegol/Documents/internship/chris-db/python_test/dicoms'):
       for fichier in fichiers:
           fullpath = os.path.join(dossier, fichier)

           print(fullpath)
           try:
          ds = pydicom.read_file(fullpath)   
          try:
              question= Question()
              question= Question( question_text=ds.StationName,question_text1=ds.ManufacturerModelName,question_text2=ds.MagneticFieldStrength,question_text3=ds.Modality)
          #question.question_texte=ds.StationName    
          except NameError:
             question.question_text='undefined'
          except NameError:
               question.question_text1= 'undefined'
          except NameError:
               question.question_text2='undefined'
          except NameError:
               question.question_text3 = 'undefined'

          question.save()
          #import pdb; pdb.set_trace()

          try:
              choice=Choice()
              choice=Choice( choice_text = ds.PatientID)
          except NameError:
              choice.choice_text='undefined'

          choice.save()

           except pydicom.errors.InvalidDicomError:
               print('not possible to know this information')

En executant la commande : python manage.py closepoll j'obtient :

File "/neuro/users/yann.mallegol/.local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 318, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: polls_choice.question_id

Il faut que j'assigne une valeur a ma FK mais j'arrive pas a trouver la methode pour.

1 Réponse

0 votes
 
Meilleure réponse

pour créer les données de l' "objet" Question on fait :

ma_question = Question.objects.create(question_text=ds.StationName,
                                      question_text1=ds.ManufacturerModelName,
                                      question_text2=ds.MagneticFieldStrength,
                                      question_text3=ds.Modality)

du coup ma_question contient l'instance de mon objet 'Question'

Ensuite pour le modele lié on fait simplement :

Choice.object.create(choice_text = ds.PatientID, question=ma_question)
répondu 4-Sep-2015 par foxmask (2,832 points)
sélectionné 4-Sep-2015 par YannMgl

je mets en commentaire un truc en plus qui alourdie la concision de la reponse :

si ca me chante je peux encore faire le save() pour modifier l'un des attributs:

ma_question.question_text1 = "est-on seul dans l'univers.?"
ma_question.save()

le reste est inchangé

j'ai vire mes except c'est beaucoup mieux comme ca. Maintenant je veux lire le fichier et si une information par exemple PatientName n'est pas presente dans le fichier alors je creer cette instance et je lui associe une valeur par defaut.

Le probleme c'est que je n'arrive pas a traduire cela en python. j'ai essaye avec le code suivant mais j'obtient toujours information = 'default' meme si elle est presente dans le fichier lu.

class Command(BaseCommand):
help = 'that does my stuff'

def handle(self, *args, **options):

   for dossier, sous_dossiers, fichiers in os.walk('/neuro/users/yann.mallegol/Documents/internship/chris-db/python_test/dicoms'):
       for fichier in fichiers:
           fullpath = os.path.join(dossier, fichier)
           if fichier.endswith('.dcm'):
            print(fullpath)
            ds = pydicom.read_file(fullpath)

            ds.PatientId='default'
            #ds.PatientAge='default'
            ds.PatientName='default'
            ds.PatientSex='default'
            ds.PatientBirthDate='default'
            ds.PatientBirthTime='default'



 ################# Patient table ###################





            b1=Question(PatientId=ds.PatientId, PatientAge=ds.PatientAge, PatientSex=ds.PatientSex, PatientBirthDate=ds.PatientBirthDate, PatientBirthTime=ds.PatientBirthTime)
            b1.save()
...