12
votes

Pouvez-vous savoir si une instance de modèle Django est "sale"?

J'aime vraiment la fonctionnalité de Sqlalchemy qui vous permet de voir si un objet est sale: s'il a été modifié puisqu'il a été récupéré de la base de données, ou la dernière fois qu'il a été enregistré.

est-il possible de trouver ces informations du Django Orm?

Notez que ce n'est pas le même que terrains sales de Django , comme je ne le fais pas Soin de ce que les données précédentes étaient, bien que la réponse de S.Lott puisse fournir un moyen de le faire, mais j'aimerais une manière qui ne frappe pas la base de données.

J'ai aussi consulté le django.db.transaction.is_dirty () , mais cela ne semble pas être la solution.


2 commentaires

La question n'est pas si différente et les mêmes réponses à Stackoverflow.com/questions/110803/Dirty-Fields-in -Django peut fonctionner pour votre problème


C'est le même type de réponse que Stackoverflow.com/a/332225/1733117


3 Réponses :


4
votes

Une solution qui fait une requête de base de données: xxx pré>

Vous pouvez ensuite ajouter ceci sous forme de classe ancêtre à un modèle. Ou, Monkey-Pattez la classe Forms.Model, si vous le souhaitez. P>

from django.db import models
models.Model.__bases__ = (DirtyMixin,) + models.Model.__bases__


5 commentaires

Cela ne vous lancera pas une exception si le modèle n'a pas encore été sauvé? On dirait que cela devrait être attrapé et vrai retourné.


Oui, c'est probablement une surveillance.


AttributeError: l'objet 'MyObject' n'a aucun attribut 'GET'. Tu ne veux pas dire quelque chose comme moi-même .__ classe __. Objets.get (pk = self.pk)?


@ Julian tout à fait probablement.


getattr (auto, f.name) plutôt que les méthodes de Dunder serait probablement plus propre ...



2
votes

Autre moyen, impliquant le remplacement __ constattr __ , est discuté à une longueur dans Django billet .


1 commentaires

C'est une bonne réponse mais serait mieux s'il s'agissait de code non seulement un lien.



1
votes

Essayez Utilisez lck.django classe TimeRackable


1 commentaires

Agréable. Cela ressemble à un moyen puissant de le faire.