Seite 2 von 2

Re: Ansatz zu neuem Projekt

Verfasst: Dienstag 19. März 2024, 20:17
von pumuckll

Code: Alles auswählen

class Checkliste(models.Model):
    liste = models.CharField(max_length=80)
Warum wird hier die "liste" erwartet?

Re: Ansatz zu neuem Projekt

Verfasst: Dienstag 19. März 2024, 20:38
von sparrow
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.

Re: Ansatz zu neuem Projekt

Verfasst: Dienstag 19. März 2024, 20:48
von pumuckll
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

Re: Ansatz zu neuem Projekt

Verfasst: Dienstag 19. März 2024, 20:59
von sparrow
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.

Re: Ansatz zu neuem Projekt

Verfasst: Dienstag 19. März 2024, 21:07
von pumuckll
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)

Re: Ansatz zu neuem Projekt

Verfasst: Mittwoch 20. März 2024, 06:23
von sparrow
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.

Re: Ansatz zu neuem Projekt

Verfasst: Mittwoch 20. März 2024, 06:25
von pumuckll
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.

Re: Ansatz zu neuem Projekt

Verfasst: Mittwoch 20. März 2024, 19:23
von pumuckll
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

Re: Ansatz zu neuem Projekt

Verfasst: Mittwoch 20. März 2024, 19:54
von noisefloor
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

Re: Ansatz zu neuem Projekt

Verfasst: Mittwoch 20. März 2024, 20:53
von pumuckll
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'')