2010-12-02 12 views
14

Was es auf der Dose sagt. Gibt es eine Möglichkeit, ein Django-Modell schreibgeschützt zu machen?Ein Django-Modell schreibgeschützt machen?

Damit meine ich ein Django-Modell, in dem einmal Datensätze erstellt wurden, sie können nicht bearbeitet werden.

Dies wäre nützlich für ein Modell, das den Transaktionsverlauf aufzeichnet.

Antwort

10

können Sie das Modell der Methode speichert außer Kraft setzen und prüfen, ob es sich um eine bestehende Einheit, in dem Fall, dass Sie keine Änderungen speichern werden:

def save(self, *args, **kwargs): 
    if self.id is None: 
     super(ModelName, self).save(*args, **kwargs) 

So in diesem Beispiel nur, um die Änderungen zu speichern, wenn das Unternehmen hat Ich habe noch keine id, was nur der Fall ist, wenn es sich um eine neue Entität handelt, die noch nicht eingefügt wurde.

+0

Falsch. Nicht-'None'-IDs, die nicht in der Tabelle vorhanden sind, werden ebenfalls neue Datensätze sein. –

+0

@Ignacio: Ich denke du hast Recht. Jemand kann die ID-Eigenschaft vor dem Speichern der Entität festlegen. In diesem Fall lautet die ID nicht None. –

+0

@tomload: Sie müssten prüfen, ob ein Element mit dieser ID bereits existiert ... –

3

Sie können die Speichermethode überschreiben und nicht Super aufrufen, wenn Sie möchten. Das wäre ein ziemlich einfacher Weg, dies zu erreichen.

Sie sollten wahrscheinlich auch eine Ausnahme auslösen, wenn ein Löschvorgang oder ein Update versucht wird, anstatt einfach zurückzukehren. Sie möchten dem Benutzer signalisieren, was passiert - dass das Verhalten nicht gültig ist.

+0

Wie erstelle ich Instanzen dieses Modells an erster Stelle? –

+0

Ja, ich habe vergessen, die ID-Prüfung zu setzen, um zu sehen, ob es ein Update oder ein Speichern war. Ich habe die Antwort aktualisiert. –

+0

+1 für den Vorschlag, eine Ausnahme auf Update/Delete zu werfen, um den Benutzer zu benachrichtigen. –

3

Neben anderen Lösungen: Wenn Ihr Hauptziel ist es Schreibzugriff vom Admin zu vermeiden, können Sie die verwendete Admin-Klasse ändern, so dass niemand ein Add/Wechsel Erlaubnis hat:

class HistoryAdmin(admin.ModelAdmin): 

    def has_add_permission(self, request): 
     return False 

    def has_change_permission(self, request, obj=None): 
     return False 

    def has_delete_permission(self, request, obj=None): 
     return False 
+5

Readonly bedeutet, dass man sie immer noch lesen kann. Wenn Sie die Änderungserlaubnis entfernen, ist das nicht mehr der Fall. – webjunkie

1

Wenn Sie don Ich möchte nicht versuchen, einen Datensatz so zu ändern, dass er im Hintergrund fehlschlägt:

Verwandte Themen