Django-fr

Forum

#1 12-02-2015 12:51:17

DJR
Membre
Inscription : 12-02-2015
Messages : 3

Import CVS & foreign key [Resolu]

Bonjour

En premier lieu je débute avec Django.

Je cherche à charger une table via un fichier CSV avec une foreignkey qui ne contient pas de valeurs unique et cela ne fonctionne pas. Toutefois, via l'interface admin j'arrive très bien à créer des enregistrements, mais comme il y a plusieurs fois le même nom de contrat puisque c'est le le couple Procédure + Contrat_texte qui est unique.

Donc en résumé, le chargement ne fonctionne pas et l'interface d'amin me propose des noms en contrat en double ou en triple... quelle serait la solution la plus élégante pour résoudre ce petit problème ?

Ci-après mes modèles

class Contrat(models.Model):
    Procedure = models.ForeignKey(Procedure)
    Contrat_text = models.CharField(max_length=150)

    def __str__(self):
        return self.Contrat_text

class Document(models.Model):
    Contrat = models.ForeignKey(Contrat)
    isContrat = models.BooleanField(('Contrat'), default=True)
    isCdC = models.BooleanField(('Cahier des Charges'), default=False)
    isCR = models.BooleanField(('Cahier de Recette'), default=False)
    isPG = models.BooleanField(('PG'), default=False)
    isCI = models.BooleanField(('CI'), default=False)
    isDico = models.BooleanField(('Dictionnaire'), default=False)
    isSFG = models.BooleanField(('SFG'), default=False)
    isGuide = models.BooleanField(('Guide'), default=False)
    isWSDL = models.BooleanField(('WSDL'), default=False)
    isDivers = models.BooleanField(('Divers'), default=False)

    def __str__(self):
            return self.Contrat

la classe admin

class ContratAdmin(admin.ModelAdmin):
    fields = ('Procedure', 'Contrat_text')
    list_display = ('Procedure', 'Contrat_text')
    ordering = ('id',)


admin.site.register(Contrat, ContratAdmin)

class DocumentAdmin(admin.ModelAdmin):
    fields = ('Contrat', 'isContrat', 'isCdC', 'isCR', 'isPG', 'isCI', 'isDico', 'isSFG', 'isGuide', 'isWSDL', 'isDivers')
    list_display = ('Contrat', 'isContrat', 'isCdC', 'isCR', 'isPG', 'isCI', 'isDico', 'isSFG', 'isGuide', 'isWSDL', 'isDivers')
    ordering = ('id',)

admin.site.register(Document, DocumentAdmin)

Ci-après le code de chargement du CSV

import subprocess
import sys
import os
import shutil
import csv

# Variables
ProjetName = "GIE_Sces"
ProjetPath = "/home/didier/python/dev/" + ProjetName
csv_pathname = ProjetPath + "/csv-files/"
csv_file = csv_pathname + "Document.csv"

print("ProjetPath=" + ProjetPath)
print("csv_file=" + csv_file)

sys.path.append(ProjetPath)

from django.core.wsgi import get_wsgi_application
os.environ['DJANGO_SETTINGS_MODULE'] = ProjetName + '.settings'
application = get_wsgi_application()

import dbSces.models

dbSces.models.Document.objects.all().delete()

dataReader = csv.reader(open(csv_file), delimiter=';', quotechar='"')

for row in dataReader:
    if not len(row) == 0:
        print(row)
        print("-->" + row[0].rstrip() + "<--")
        DocumentFields = dbSces.models.Document()
        DocumentFields.Contrat = dbSces.models.Contrat.objects.get(Contrat_text=row[0].rstrip())
        DocumentFields.isContrat = row[1]
        DocumentFields.isCdC = row[2]
        DocumentFields.isCR = row[3]
        DocumentFields.isPG = row[4]
        DocumentFields.isCI = row[5]
        DocumentFields.isDico = row[6]
        DocumentFields.isSFG = row[7]
        DocumentFields.isGuide = row[8]
        DocumentFields.isWSDL = row[9]
        DocumentFields.isDivers = row[10]
        DocumentFields.save()

L'erreur lors du chargement

Traceback (most recent call last):
  File "/home/didier/python/dev/GIE_Sces/csv-import/Import-document.py", line 47, in <module>
    DocumentFields.Contrat = dbSces.models.Contrat.objects.filter(Contrat_text__in=row[0].rstrip())
  File "/usr/local/lib/python3.4/dist-packages/Django-1.7.4-py3.4.egg/django/db/models/fields/related.py", line 597, in __set__
    self.field.rel.to._meta.object_name,
ValueError: Cannot assign "[]": "Document.Contrat" must be a "Contrat" instance.

Merci de votre aide et de votre indulgence

Dernière modification par DJR (12-02-2015 17:10:17)

Hors ligne

#2 12-02-2015 15:20:45

DJR
Membre
Inscription : 12-02-2015
Messages : 3

Re : Import CVS & foreign key [Resolu]

Bon ben je vais me répondre à moi même donc !

Sur le modèle il faut virer la foreignkey par

class Document(models.Model):
    [b]Contrat = Contrat.objects.order_by('Contrat_text').distinct('Contrat_text')[/b]
    isContrat = models.BooleanField(('Contrat'), default=True)
    isCdC = models.BooleanField(('Cahier des Charges'), default=False)
    isCR = models.BooleanField(('Cahier de Recette'), default=False)
    isPG = models.BooleanField(('PG'), default=False)
    isCI = models.BooleanField(('CI'), default=False)
    isDico = models.BooleanField(('Dictionnaire'), default=False)
    isSFG = models.BooleanField(('SFG'), default=False)
    isGuide = models.BooleanField(('Guide'), default=False)
    isWSDL = models.BooleanField(('WSDL'), default=False)
    isDivers = models.BooleanField(('Divers'), default=False)

    def __str__(self):
            return self.Contrat

Maintenant reste plus qu'à modifier admin.py pour éviter l'erreur

DISTINCT ON fields is not supported by this database backend

I'll be back...

Hors ligne

Pied de page des forums