2016-08-12 2 views
3

In MS SQL Server gibt es eine Funktion, um eine berechnete Spalte zu erstellen: eine Tabellenspalte, die zum Abrufzeitpunkt fliegend berechnet wird. Dies entspricht mehr oder weniger der Verwendung einer Methode für ein Django-Modell, um einen berechneten Wert abzurufen (das gängige Beispiel ist das Abrufen des vollständigen Namens basierend auf gespeicherten Feldern Vorname/Nachname).Persistent Berechnete Felder in Django

Für teure Operationen bietet SQL Server eine Option Persisted. Dies füllt die Tabellenspalte mit den Ergebnissen der Berechnung und aktualisiert diese Ergebnisse, wenn die Tabelle aktualisiert wird - ein sehr nützliches Feature, wenn die Berechnung nicht schnell ist, sich aber im Vergleich zum Zugriff nicht häufig ändert.

Allerdings kann ich in Django keine Möglichkeit finden, diese Funktionalität zu duplizieren. Fehle ich etwas Offensichtliches? Meine beste Vermutung wäre eine Art benutzerdefiniertes Feld, das eine Funktion als Parameter verwendet, aber ich konnte keine bereits vorhandene sehen. Gibt es einen besseren Weg?

Antwort

3

Ein Ansatz ist nur ein regelmäßiges Modellfeld zu verwenden, die berechnet wird, wenn ein Objekt gespeichert wird, zB ,:

class MyModel(models.Model): 
    first_name = models.CharField(max_length=255) 
    surname = models.CharField(max_length=255) 

    # This is your 'persisted' field 
    full_name = models.CharField(max_length=255, blank=True) 

    def save(self, *args, **kwargs): 
     # set the full name whenever the object is saved 
     self.full_name = '{} {}'.format(self.first_name, self.surname) 
     super(MyModel, self).save(*args, **kwargs) 

Sie könnten dieses Spezialgebiet machen read-only im Admin und in ähnlicher Weise exclude it von irgendwelchen Vordrucken .

+0

Ich bin anscheinend ein Idiot. Dies ist eine großartige Möglichkeit, das Problem zu lösen. Ich würde es jedoch leicht ändern und in die Sicherungssignale einhaken, da ich das Feld bei Einfügungen und Löschungen neu berechnen muss (hängt von der Anzahl der Einträge ab). Aber ja, dieser Ansatz ist im Wesentlichen richtig. – James

Verwandte Themen