2016-07-20 6 views
0

In meinem Anwendungsfall erhalte ich für 10 Sekunden immer Daten von verschiedenen Geräten, wenn sie sind Aktiv (aktiv = True)So aktualisieren Sie Django-Modellobjekte, wenn im Laufe der Zeit kein Update erfolgt ist (zB 10 Sekunden)

Immer wenn ich Daten erhalte, aktualisiere ich ein bestimmtes Django-Objekt (Datenbank). Aber ich werde nie erfahren, ob ein Gerät inaktiv ist.

Es ist klar, dass, wenn ich nicht Daten für alle 10 Sekunden bekommen soll ich dieses Objekt aktiv markiert = False

In meiner Datenbank, fast 100k Datensätze vorhanden und konnte nicht durchführen cron oder ein Skript für alle zu aktualisierenden Datensätze

Gibt es eine Möglichkeit, wenn kein Update passierte auf jedes Objekt im Laufe der Zeit in bestimmtem Modell

Antwort

2

Haben Sie aktiv markiert = False als aktive sie tatsächlich benötigen automatisch zu markieren?

Wie wäre es, einfach die Zeit des letzten Updates aufzuzeichnen und active eine berechnete Eigenschaft zu machen?

from django.utils import timezone 

# in your model, remove the "active" field 
# and store the last update's datetime in a "last_update" field 
# then... 
@property 
def active(self): 
    delta = timezone.now() - self.last_update 
    return delta.total_seconds() < 10 

das ist, wie es ist in der Regel getan, wenn Sie einige Code ausführen müssen genau nicht, wann die Zustandsänderungen: Sie können es einfach auf Basis von Daten berechnen, die nicht asynchron aktualisiert werden muss.

+0

Danke für die Antwort Spektren. Ich kann das Feld aktualisieren, wenn ich die Daten vom Gerät bekomme. Aber die Anforderung ist, dass das Modell aktualisiert werden sollte, wenn ich keine Daten vom Gerät erhalte. Das Objekt wurde heute um 17:30:10 Uhr aktualisiert. Wenn ich keine Daten um 05: 30: 20 PM erhalte, muss dieses Objekt alle 10 Sekunden als inaktiv markiert werden – user2959723

+0

Objekte müssen überwacht werden, ob jetzt - updated_time <10 – user2959723

+0

Verwenden auch andere Programme die Datenbank? Wenn die Datenbank nur von django aus aufgerufen wird, sehen Sie, dass 'device.active' 10 Sekunden nach der letzten Aktualisierung von 'Wahr' auf 'Falsch' wechselt. Der einzige Unterschied besteht darin, dass es nicht von einem tatsächlichen Datenbankfeld unterstützt wird, sondern direkt generiert wird. – spectras