Modell sollen einen eintrag in eine db machen

Django, Flask, Bottle, WSGI, CGI…
Antworten
SehrKreativ
User
Beiträge: 2
Registriert: Dienstag 19. Juli 2022, 06:32

Hallo

Mein Projekt stell aufgaben bereit:
Das Umrechnen von Binären zahlen in dezimale
Das errechnen von Subnetzmasken, Broadcast Adressen u.s.w.

Problem:
Nun hätte ich gerne eine Seite die Auskunft darüber gibt welcher User in welcher Aufgabe der beste ist.
Alle User & Ergebnisse abfragen ist kein Problem, nur die verschiedenen Aufgaben stehen in keiner DB.

Theorie:
Eine modell erstellen das die Daten fassen kann.
Nun könnte man in jedem aufgaben-modell die init überschreiben um einen Eintrag in die db zu machen.
Dagegen spricht: jede Instanz würde das dann machen (unnötig). beim überschreiben geht die Funktionalität der ursprünglich init verloren.

Hat jemand eine andere idee ?
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

hast du vielleicht mal ein Codebeispiel, wie das Ganze aussieht/abläuft?

Wenn du die Ergebnisse abfragen kannst, wieso kannst du sie dann nicht auswerten?

Mir fehlt gerade die Vorstellung für dein Problem.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Deine Frage ist wesentlich weniger klar, als du das wahrscheinlich selbst denkst. "Modelle" kann vieles bedeuten. Arbeitest du mit Django ORM, oder mit SQLAlchemy und Flask? Abhaengig davon mag die Antwort sehr unterschiedlich aussehen. Da musst du noch weiter ausholen.

Und dann gaebe es da abhaengig von der Datenbank ggf. auch noch Trigger, oder in der Anwendung eine Loesung, die gar nichts direkt mit den Modellen zu tun hat.

Deine Befuerchtungen dazu, dass ueberschreiben die urspruengliche Funktion verliert, ist allerdings schonmal als Quatsch identifizierbar. Simples Gegenbeispiel:

Code: Alles auswählen

class A: 
    def __init__(self):
        print("A)

class B(A):
    __init__(self):
        super.__init__() # muss  man halt machen. Oder anders, __blackjack__ mag super nicht(tm)
        print("B")
Benutzeravatar
__blackjack__
User
Beiträge: 13115
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hey, `super()` ist total super — es fehlt bei `A`. 😛
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

:D War klar.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Nun hätte ich gerne eine Seite die Auskunft darüber gibt welcher User in welcher Aufgabe der beste ist.
Alle User & Ergebnisse abfragen ist kein Problem, nur die verschiedenen Aufgaben stehen in keiner DB.
Wie speicherst du denn die Ergebnisse ab? Wenn man ein Ergebnis keiner Aufgabe zuordnen kann, kann man wohl auch quasi zwangsläufig kein Ergebnis pro Aufgabe abfragen... Und warum speicherst die die Aufgabe nicht in eine separate Tabelle? Dann hättest du in simpelsten Fall eine Aufgabentabelle, eine Nutzertabelle und eine Ergebnistabelle mit 2x 1:N Beziehung letzterer zu den beiden ersten.

Gruß, noisefloor
SehrKreativ
User
Beiträge: 2
Registriert: Dienstag 19. Juli 2022, 06:32

__deets__ hat geschrieben: Dienstag 19. Juli 2022, 09:13 Deine Frage ist wesentlich weniger klar, als du das wahrscheinlich selbst denkst. "Modelle" kann vieles bedeuten. Arbeitest du mit Django ORM, oder mit SQLAlchemy und Flask? Abhaengig davon mag die Antwort sehr unterschiedlich aussehen. Da musst du noch weiter ausholen.

Hallo

Daran habe ich nicht gedacht, sory.
verwende Django | Django ORM | SQLLite.


model.py

Code: Alles auswählen

from django.db import models
from django.contrib.auth.models import User
from berichte.models import AufgabenIndex
from .func import validate_even,get_8bit
# Create your models here.





class BinDez(models.Model):


    dieBin = models.CharField(max_length=8)
    userIn = models.IntegerField(validators=[validate_even])
    wann = models.DateTimeField(auto_now_add=True)
    foren = models.ForeignKey(User,on_delete=models.CASCADE,null=True)
    richtig = models.BooleanField(default= False)

     
    def __str__(self):
        return self.dieBin

class KlassenRaten(models.Model):
    #broadcast netz-id/Host-id

    ip = models.CharField(max_length=34,default="")
    subnet = models.CharField(max_length=34,default="")

    nk = [('A',"Klasse-A"),('B',"Klasse-B"),('C',"Klasse-C"),('CIDR',"Classless Inter-Domain Routing")]
    klasse = models.CharField(max_length=4,choices=nk,default=nk[0])
    klassen_rf = models.BooleanField(default=False)

    asw = models.IntegerField()#alternative schreibweise
    asw_rf = models.BooleanField(default=False)
    amh = models.IntegerField()#anzhal möglicher hosts
    amh_rf = models.BooleanField(default=False)
    ams = models.IntegerField() # anzahl möglicher subnetze
    ams_rf = models.BooleanField(default=False)
    brod = models.CharField(max_length=34,default="")
    brod_rf = models.BooleanField(default=False)

    netz_id = models.CharField(max_length=34)
    netz_id_rf = models.BooleanField(default=False)

    host_id = models.CharField(max_length=34)
    host_id_rf = models.BooleanField(default=False)

    wann = models.DateTimeField(auto_now_add=True)
    foren = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    richtig = models.BooleanField(default=False)

    def __str__(self):
        return str(self.ip)+"/"+str(self.subnet)
forms.py

Code: Alles auswählen

class FullIPK(forms.ModelForm):


    class Meta:
        fields = ["klasse","asw","amh","ams","brod","netz_id","host_id"]
        # fields = ["ip","subnet","klasse","asw","amh","ams","brod","netz_id","host_id"]

        model = KlassenRaten

    def __init__(self,*args,**kwargs):
        super(FullIPK,self).__init__(*args,**kwargs)
        self.fields["klasse"].label = "Klasse"
        self.fields["asw"].label = "Alternative schreibweise"
        self.fields["amh"].label = "Anzahl möglicher Hosts"
        self.fields["ams"].label = "Anzahl möglicher Subnetze"
        self.fields["brod"].label = "Broadcast"
        self.fields["netz_id"].label = "Netzwerk ID"
        self.fields["host_id"].label = "Host ID"
        self.fields["host_id"].widget.attrs["placeholder"] = "Bsp. 0.0.15.255"


        for feld in self.fields:
            self.fields[feld].widget.attrs['class'] = "form-control"

class Maraton(forms.ModelForm):
    dieBin = forms.CharField(max_length=8,required=False)
    userIn = forms.IntegerField()

    class Meta:
        model = BinDez
        fields = ['userIn']

    def __init__(self,*args,**kwargs):
        super(Maraton,self).__init__(*args,**kwargs)
        #<label for="inputPassword6" class="fs-3 col-form-label col">{
        # self.fields['dieBin'].widget.attrs['for'] = "inputPassword6"
        self.fields['dieBin'].widget.attrs['class'] = "form-control"
        self.fields['dieBin'].widget.attrs['aria-label'] = 'Disabled input example'
        self.fields['dieBin'].widget.attrs['readonly'] = True
        self.fields['dieBin'].widget.attrs['disabled'] = True
        self.fields['dieBin'].label = ""


        self.fields['userIn'].widget.attrs['class'] = 'form-control'
        self.fields['userIn'].widget.attrs['id'] = 'inputPassword6'
        self.fields['userIn'].widget.attrs['aria-describedby'] = 'passwordHelpInline'
        self.fields['userIn'].label = ""
Kommt nun jemand und füllt diese Forms dann werden die abgespeichert, soweit so gut.
Nun soll eine Tabelle anzeigen welcher user wie viele aufgaben erledigt hat. Alle Spalten in der Tabelle lassen sich dynamisch erstellen, bis auf "Aufgabe".

Aufgabe | User | Erledigt | davon Richtig <<< tabelle
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

es wäre echt hilfreich, wenn du mal versuchen würdest zu so zu (be-) schreiben, dass auch Leute (wie wir) das verstehen, die _nicht_ wissen, was du genau machst. Z.B. was meinst du z.B. mit "Tabelle" in deinem Kontext - eine Tabelle in der DB oder eine HTML-Tabelle in der Ausgabe?

Ich vermutet, dein Designentwurf ist kaputt, im Sinne von, dass die Modelle (und damit die DB Struktur) suboptimal ist. In KlassenRaten hast du keine Referenz auf einen Nutzer -> damit hast du keine Möglichkeit abzufragen, welcher Nutzer die Ausgabe wann gelöst hat. Es sei denn, du hättest noch eine weitere Tabelle in der DB, die du hier nicht zeigst, die Nutzer-ID und Aufgabe zusammenführt.

Warum setzt du in den Modellen nicht direkt den "verbose name" - dann kannst du dir das ganze nachträgliche definieren der Label in den Forms sparen, weil das automatisch läuft.

Gruß, noisefloor
Antworten