Ansatz zu neuem Projekt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

Code: Alles auswählen

class Checkliste(models.Model):
    liste = models.CharField(max_length=80)
Warum wird hier die "liste" erwartet?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Gar nicht.
Wie kommst du auf das Feld?
Schau dir die Fehlermeldung mal genau an. Ich würde sie dir ja kopieren, weil da sowohl das Model als auch der Feldname steht, aber das ist die Krux, wenn man Fehlermeldungen als Bild und nicht als Text postet - kein Kopieren. Schadebanane.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

das model

Code: Alles auswählen

class Audit_Ereignis(models.Model):
    checkliste = models.ForeignKey(Checkliste, on_delete=models.CASCADE)
    objektort = models.ForeignKey(ObjektOrt, on_delete=models.CASCADE)
    pruefpunkt = models.ForeignKey(Audit, on_delete=models.CASCADE)
    ok = models.CharField(max_length=3, choices=oknok.choices, default=oknok.ok)
    mangel = models.ForeignKey(MangelArt, on_delete=models.CASCADE,)
    frist = models.DateField()
    behoben = models.DateTimeField()
    von = models.ForeignKey(Benutzer, on_delete=models.CASCADE)
die Funktion

Code: Alles auswählen

def import_csv(request):
    if request.method == 'POST':
        form = CSVImportForm(request.POST, request.FILES)
        if form.is_valid():
            csv_file = request.FILES['csv_file'].read().decode('utf-8').splitlines()
            csv_reader = csv.DictReader(csv_file, delimiter=",")

            for row in csv_reader:
                Audit_Ereignis.objects.create(
                    checkliste=row["checkliste"],
                    objektort=row['objektort'],
                    pruefpunkt=row['pruefpunkt'],
                    ok=row['ok'],
                    mangel=row['mangel'],
                    frist=row['frist'],
                    behoben=row['behoben'],
                    von=['ok'],

                )

            return redirect('csv/home')  # Redirect to a success page
    else:
        form = CSVImportForm()

    return render(request, 'csv/import.html', {'form': form})

Fehler:

Code: Alles auswählen

  File "D:\drive\soft\pycharm\djangoHACCP\.venv\Lib\site-packages\django\db\models\fields\related_descriptors.py", line 284, in __set__
    raise ValueError(
ValueError: Cannot assign "'Checkliste A'": "Audit_Ereignis.checkliste" must be a "Checkliste" instance.
[19/Mar/2024 20:46:27] "POST /import-csv/ HTTP/1.1" 500 90068
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Und hier versuchst du dem Feld "checkliste" in dem Model Audit_Ereignis dem Wert "Checkliste A" zuzuweisen.
checkliste muss aber eine Instanz von Checkliste sein (oder eine ID von Checkliste, dann würde die Datenbank das intern prüfen).

"Checkliste A" ist aber eine Zeichenkette und es scheint auch keine Checkliste mit dem PrimaryKey "Checkliste A" zu geben.
Mehr als das, was der Fehler sagt, kann man auch nicht helfen. Falsl "Checkliste A" so etwas wie ein Name ist, musst du das passende Objekt aus der Datenbank selektieren. Automagisch passiert das nicht.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

Ich muss es als mit einem Element in der "liste = models.CharField(max_length=80) vergleichen oder fragen ob es darin vorkommt?

Code: Alles auswählen

class Checkliste(models.Model):
    liste = models.CharField(max_length=80)
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Auch hier gilt: Namen sind wichtig! Das Feld "liste" in einem Model "Checkliste" lässt jetzt nicht vermuten, dass sich dahinter die Bezeichnung oder der Name verbirgt. Es sollte also besser "name" heißen.

Und "Audit_Ereignis" wird nach Konvention "AudirEreignis" geschrieben.

Ich weiß ehrlich gesagt nicht, was du mit deinem vorherigen Post meinst. Du musst die passende Checkliste übergeben. Und wenn der Wert der in der CSV-Datei steht, der Name ist, dann musst du den Eintrag aus der Datenbank selektieren.
Lies dir durch, wie in Django .get() und .filter() bzw. Querysets funktionieren. Ersteres wirst du brauchen.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

Bild

Code: Alles auswählen

                Audit_Ereignis.objects.create(
                    checkliste_id=row["checkliste"],
                    objektort_id=row['objektort'],
                    pruefpunkt_id=row['pruefpunkt'],
                    ok=row['ok'],
                    mangel_id=row['mangel'],
                    frist=row['frist'],
                    behoben=row['behoben'],
                    von_id=['ok'],
                )
Danke, manchmal muss man einfach darüber im Schlaf nachdenken.

Komme weiter und erhalte neuen Fehler:

Code: Alles auswählen

  File "D:\drive\soft\pycharm\djangoHACCP\.venv\Lib\site-packages\django\db\models\fields\__init__.py", line 2119, in get_prep_value
    raise e.__class__(
ValueError: Field 'id' expected a number but got 'Checkliste A'.
[20/Mar/2024 06:17:16] "POST /import-csv/ HTTP/1.1" 500 148922
Jetzt muss ich 'Checkliste A in Checkliste.liste suchen und die ID übergeben oder?

Dazu bitte auch eien Tip

Edit:
vorherigen Post ers jetzt gesehen. werde mir das ansehen.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

So funktioniert es:

Code: Alles auswählen

            for row in csv_reader:
                Audit_Ereignis.objects.create(
                    checkliste=Checkliste.objects.get(name=row["checkliste"]),
                    pruefpunkt=Audit.objects.get(name=row['pruefpunkt']),
                    ok=oknok.objects.get(name=row['ok']),
                    objektort=ObjektOrt.objects.get(name=row['objektort']),
                    mangel=MangelArt.objects.get(name=row['mangel']),
                    frist=row['frist'],
                    behoben=row['behoben'],
                    von=Benutzer.objects.get(name=row['von']),
Besten Dank
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

sollte

Code: Alles auswählen

class Checkliste(models.Model):
    liste = models.CharField(max_length=80)
nicht mindestens noch eine Unique Constrain bekommen? Aktuell ist es, dass du beliebig viele Checklisten mit identischem Namen anlegen kannst. Ist das gewollt?

Gruß, noisefloor
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

nein hab das bereits gesehen

wird noch ungefähr so geändert:

Code: Alles auswählen

.CharField(max_length=64, unique=True)

.ForeignKey(Country, to_field='name', default="Checkliste A'')
Antworten