Parfois, nous sauvegardons certains champs qui changent beaucoup à Redis ou d'autres backends.Comment faire un attribut automatique non-base de données à une instance de modèle Django
Mais de cette façon, nous pourrions perdre la commodité d'obtenir une valeur d'une instance par article.count
.
Nous définissons généralement une fonction de propriété à un modèle, qui effectue la logique d'interrogation de la base de données basée sur la mémoire.
class WhatEver(models.Model):
@property
def some_field(self):
return redis.hget('what-ever-%s' % self.id)
def set_some_field(self, value):
return redis.hset('what-ever-%s' % self.id, value)
Laide, mais utile. Mais, cela ne marche pas tout le temps, car c'est une manière intrusive de nous apporter la capacité.
Dites, nous voulons obtenir un visites de l'utilisateur,
Nous voulons vraiment appeler user.visits
,
Mais ce n'est pas bon pour un sous-module pour remplacer le module de base, donc nous ne pouvons l'envelopper comme fonction get_user_visits(user)
et encore, pas élégant.
Avons-nous un moyen de faire ce genre de trucs automatiquement et de manière non intrusive?
Merci pour votre réponse. Existe-t-il un moyen d'utiliser le mécanisme ORM de Django, mais pas de «remplacer» ou de «corriger le singe» des modules? Serait-il préférable de "simuler" un modèle? – Cai
Ce que je vous ai décrit n'est ni l'écrasement ni le patch de singe. C'est la manière décrite dans la documentation d'enrichir l'ORM avec des fonctionnalités personnalisées. –
Oui, c'est. Mais il doit changer les 'objets 'assignés dans la classe Model? Comme je le sais, il n'est pas capable d'appeler à partir d'une instance comme 'instance.visits', à moins d'écraser ou de corriger le module original. – Cai