Seite 1 von 1

wie finde ich FOREIGN KEYs?

Verfasst: Donnerstag 7. November 2024, 17:11
von Pitwheazle
In meinem Rechentrainer habe ich die Accounts mit einer OneToOne Beziehung mit einem "Profil" verknüpft und dieses mit wiederum mit anderen Tabellen.
Einige Schülerinnen und Schüler haben zwar einen Account, haben es aber irgendwie geschafft, ihre Anmeldung abzubrechen, ohne ein Profil anzulegen.
Ich möchte jetzt aus meiner Datenbank die "Karteileichen" löschen, die sich vor längerer Zeit angemeldet haben und das Programm nicht weiter genutzt haben. Diejenigen, die ein Profil angelegt haben kann ich löschen, bei denjenigen, die kein Profil haben, gelingt es mir nicht "FOREIGN KEY constraint failed". Ich habe schon gemerkt, dass ich die Gruppenzuweisung "Schüler" löschen muss. Das reicht aber nicht. Wie bekomme ich raus, welche Beziehung hier noch besteht.

Code: Alles auswählen

def loeschen_alt(req):
    auswahl = User.objects.filter(date_joined__lt=date(2023,8,1))
    n=0 
    m=0
    nachricht = ""  
    for a in auswahl:
        if (a.date_joined.date() ) == ((a.last_login.date() )):
            user = Profil.objects.filter(user = a).first()
            aufgaben = Protokoll.objects.filter(user_id = a.id).count()
            n +=1
            m += aufgaben
            nachricht = str(a)
            if user == None:
                print(a, a.pk)
                nachricht += " hat kein Profil und"
            else:
                nachricht += ": " +user.vorname + " " + user.nachname+ " hat"
            nachricht += " sich nur einmal angemeldet, letzter Login: "+ str(a.last_login.date())+ " - Account wurde gelöscht"
            a.groups.clear()
            #print(nachricht)
            a.delete()
    nachricht = str(n) + " Accounts mit " + str(m) + " Aufgaben gelöscht"
    return HttpResponse(nachricht)

Re: wie finde ich FOREIGN KEYs?

Verfasst: Donnerstag 7. November 2024, 18:07
von __blackjack__
@Pitwheazle: Ich glaube das Thema Namensgebung hatten wir schon mal. `n` und `m` sind keine guten Namen. Ebenso `a`. Oder `user` für ein `Profil`, insbesondere wenn es gleichzeitig auch `User`-Objekte gibt.

Da wird viel unnützes mit `nachricht` gemacht was dann überhaupt nicht verwendet wird. Und ich glaube Zeichenkettenformatierung statt `str()` und ``+`` hatten wird auch schon mal. Eventuell sogar, dass man Zeichenketten nicht wiederholt mit ``+`` oder ``+=`` in einer Schleife erweitert, weil das ineffizient ist, und stattdessen die Teilzeichenketten in einer Liste sammelt und dann am Ende mit der `join()`-Methode zusammensetzt.

Den Datumsvergleich könnte man auch gleich die Datenbank machen lassen. Dann bleibt das hier (ungetestet):

Code: Alles auswählen

def loeschen_alt(_request):
    kontenanzahl = 0
    aufgabenanzahl = 0
    for user in User.objects.filter(
        date_joined__lt=date(2023, 8, 1),
        date_joined__date=F("last_login__date"),
    ):
        kontenanzahl += 1
        aufgabenanzahl += Protokoll.objects.filter(user_id=user.id).count()
        user.groups.clear()
        user.delete()

    return HttpResponse(
        f"{kontenanzahl} Accounts mit {aufgabenanzahl} Aufgaben gelöscht"
    )

Re: wie finde ich FOREIGN KEYs?

Verfasst: Donnerstag 7. November 2024, 20:55
von Pitwheazle
__blackjack__ hat geschrieben: Donnerstag 7. November 2024, 18:07 @Pitwheazle: Ich glaube das Thema Namensgebung hatten wir schon mal. `n` und `m` sind keine guten Namen. Ebenso `a`.
Da wird viel unnützes mit `nachricht` gemacht was dann überhaupt nicht verwendet wird.
Vielen dank soweit. An den Benenneungen arbeite ich. Und die Nachrichten werden schon verwendet, ich habe den Code gekürzt.
Das hilft mir aber bei der Fragestellung nicht weiter. Warum kann ich die User ohne Profil nicht löschen?

Re: wie finde ich FOREIGN KEYs?

Verfasst: Donnerstag 7. November 2024, 21:36
von sparrow
Wie lautet die komplette Fehlermeldung?
Soweit mir bekannt, kann dieser Fehler - der direkt aus der Datenbank kommt - nur passieren, wenn dort ein Foreign Key vorhanden ist, der Django nicht bekannt ist. Sonst würde Django eine Exception werfen.
Der Admin-Bereich zeigt dir beim Löschen auch die Objekte an, die geschützt sind oder mitgelöscht werden würden.
Vorausgesetzt deine Repräsentation im ORM entspricht der Datenbank.

Re: wie finde ich FOREIGN KEYs?

Verfasst: Donnerstag 7. November 2024, 22:46
von Pitwheazle
Die Fehlermeldung:

Code: Alles auswählen

[07/Nov/2024 22:39:02] "GET /admin/auth/user/108/delete/?_changelist_filters=p%3D13 HTTP/1.1" 200 11786[07/Nov/2024 22:39:02,519] - Broken pipe from ('127.0.0.1', 50296)
[07/Nov/2024 22:39:02,520] - Broken pipe from ('127.0.0.1', 50297)
[07/Nov/2024 22:39:02] "GET /staticfiles/admin/img/icon-addlink.svg HTTP/1.1" 200 331
Not Found: /favicon.ico
[07/Nov/2024 22:39:02,712] - Broken pipe from ('127.0.0.1', 50298)
C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\fields\__init__.py:1600: RuntimeWarning: DateTimeField User.date_joined received a naive datetime (2023-08-01 00:00:00) while time zone support is active.
  warnings.warn(
mail@example.com 108
Internal Server Error: /loeschen_alt/
Traceback (most recent call last):
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 299, in _commit
    return self.connection.commit()
sqlite3.IntegrityError: FOREIGN KEY constraint failed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Dropbox\RechentrainerApp\rechentrainer.app\accounts\views.py", line 886, in loeschen_alt    
    a.delete()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\base.py", line 1183, in delete
    return collector.delete()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\deletion.py", line 459, in delete
    with transaction.atomic(using=self.using, savepoint=False):
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\transaction.py", line 263, in __exit__
    connection.commit()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 323, in commit
    self._commit()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 298, in _commit
    with debug_transaction(self, "COMMIT"), self.wrap_database_errors:
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 299, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed
[07/Nov/2024 22:41:56] "GET /loeschen_alt/ HTTP/1.1" 500 105289
Not Found: /favicon.ico
[07/Nov/2024 22:41:56,568] - Broken pipe from ('127.0.0.1', 50376)
... und wenn ich den Nutzer im Admin Tool löschen will:

Re: wie finde ich FOREIGN KEYs?

Verfasst: Freitag 8. November 2024, 11:14
von geraldfo
Das mit den roten X-en ist aber keine geeignete Methode, um Daten unsichtbar zu machen.

Re: wie finde ich FOREIGN KEYs?

Verfasst: Freitag 8. November 2024, 11:17
von __blackjack__
Zumal die E-Mail-Adresse noch mal im Klartext im Traceback steht. 😛

Re: wie finde ich FOREIGN KEYs?

Verfasst: Freitag 8. November 2024, 11:17
von geraldfo
Zusätzlich steht die offenbar vertrauliche E-Mail-Adresse weiter oben im Klartext in der Fehlermeldung.

Re: wie finde ich FOREIGN KEYs?

Verfasst: Freitag 8. November 2024, 13:13
von Pitwheazle
:? :?

Re: wie finde ich FOREIGN KEYs?

Verfasst: Freitag 8. November 2024, 13:43
von Kebap
Pitwheazle hat geschrieben: Freitag 8. November 2024, 13:13:? :?
Suche mal im Code-Teil deines letzten Beitrags hier nach dem Klammeraffen @ und lösche die ganz fix da raus.

Re: wie finde ich FOREIGN KEYs?

Verfasst: Sonntag 10. November 2024, 11:00
von Damaskus
Die nächste Aufforderung zum löschen von Daten, kostet einen Kaffee...!
Bitte beim Posten ALLE Daten anonymisieren.