Vous n'êtes pas identifié(e).
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
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