Mongoengine creation_time attribut dans le Document
Je suis en train d'ajouter un creation_time
attribut de mes documents. Voici un exemple:
import datetime
class MyModel(mongoengine.Document):
creation_date = mongo.DateTimeField()
modified_date = mongo.DateTimeField(default=datetime.datetime.now)
Django modèles ont construit dans les paramètre pour leur DateTimeField
objets comme add_now
, etc.,
mais MongoEngine ne prend pas en charge cette.
Je me demande si la meilleure façon pour ce faire est la suivante:
m,created = MyModel.objects.get_or_create()
if created:
m.creation_date = datetime.datetime.now()
ou si il y a une meilleure, plus agréable.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez remplacer la méthode save.
clean
méthode au lieu desave
doit être le meilleur, docs iciupdate
Comme une parenthèse, le temps de création est gravé sur le
_id
attribut - si vous n':Vous donnera un datetime timbre.
@property
sur une fonction comme celle-ci pour obtenir le created_time:def created_at(self): return self.id.generation_time if self.id else None
Une bonne solution est la réutilisation d'un seul gestionnaire de signal pour plusieurs documents.
Être prudent pour attribuer un callable et non pas une valeur fixe comme valeur par défaut, par exemple
default=datetime.utcnow
sans()
. Certains des autres réponses sur cette page sont erronées et serait la cause decreated_at
pour les nouveaux documents à toujours être à l'heure à votre application a d'abord été chargé.Il est également toujours préférable de stocker des dates UTC (
datetime.utcnow
au lieu dedatetime.now
) dans votre base de données.Ma solution préférée consiste à utiliser le
@property
décorateur pour revenir à la création datetime comme extrait de l'ObjectId:Si vous utilisez le champ timestamp dans un tas de Documents que vous pouvez garder votre code SEC par la création d'un Document abstrait à la place.
self.updated_at = datetime.now()
en vertu d'unelse
déclaration, de sorte que vous pouvez garder l'idée de "si le updated_at est nul, cela signifie que le modèle n'a jamais été mis à jour".Traditionnellement, j'ai mis le
creation_date
par défaut pourdatetime.now()
puis ont caché le champ sur l'admin forme de sorte que vous enlevez la possibilité à un utilisateur d'écraser la valeur correcte. Qui nécessite pratiquement pas de code.Substitution de la méthode save comme suggéré par Willian est également efficace puisque vous pouvez programmtically bloquer les mises à jour du
creation_date
et mise à jour de lamodfied_date
en même temps.Vous pouvez utiliser auto_now_add paramètre comme par la documentation: