7
votes

Impossible d'utiliser une classe de méta de Django Model pour configurer un champ défini dans un modèle abstrait héréditaire

Je voudrais utiliser des propriétés à partir d'une classe de méta de modèle héritante pour configurer un champ défini dans un modèle abstrait plus haut en haut de l'arborescence d'héritage: xxx

Je voudrais le texte d'aide sur le nom Le champ de propriétaire de propriétaire forme pour dire «un nom significatif pour cet objet appartenant». mais ce n'est pas : le mot "appartenant" est manquant, ce qui suggère que le nom verbose_name à partir de NamedModel.Meta est utilisé lorsque le modèle est configuré, non pas propriétaireModel.meta. < p> Ce n'est pas tout à fait ce que j'attends d'un point de vue de l'héritage: existe-t-il un moyen d'obtenir le champ pour être créé par lequel meta.verbose_name fait référence à la valeur de la classe de modèles non abstraite, pas l'abstrait sur laquelle Le champ a été défini?

ou suis-je DAFT?

(Cela peut sembler un exemple trivial, et c'est juste pour illustrer le point de quelque chose de plus important et complexe que j'essaie de faire)

Merci d'avance.


0 commentaires

3 Réponses :


1
votes

Je pense que cela se produit parce que meta.verbose_name est utilisé et nomméModel.name est créé lorsque la classe nomméeModel est analysée. Donc, plus tard, lorsque la classe est à l'échelle de la classe, il n'y a aucune chance de changer quoi que ce soit.

Peut-être que vous pouvez définir la propriété help_text sur propriétaireModel.name plus tard, mais cela peut changer NamedModel.Name également.

Dans des situations similaires, j'ai placé les pièces variables en attributs de classe du modèle (non méta), puis utilisé les méthodes / propriétés de temps d'exécution pour générer les textes dont j'ai besoin.


1 commentaires

Oui, je pense que c'est ça. Après avoir suivi le flux, je suis plus clair sur le cycle de vie: les champs sont évalués lorsque la classe est analysée, l'héritage n'est donc pas considérée. Et j'ai essayé des attributs de classe en dehors de Meta ... même problème bien sûr. Je suis heureux de remplacer les classes de champs et je peux l'utiliser (+ ce que vous suggérez) pour obtenir l'effet souhaité.



1
votes

En fait, j'ai fini par faire ce qui suit. Le modèle de base reçoit une méthode de classe dynamic_field_definition (), qui peut être utilisée pour corriger les champs, l'argument CLS étant la classe correcte (héritante). Cela signifie que les attributs Meta des CLS sont de cet enfant correct, pas de la base d'origine.

i Filtrez ensuite cette méthode pour être appelée sur le signal de catégorie_prepared, de sorte que vous saviez que tout soit autrement prêt. P>

class NamedModel(models.Model):
    ...
    @classmethod
    def dynamic_field_definition(cls):
        pass

def dynamic_field_definition(sender, **kwargs):
    if issubclass(sender, NamedModel):
        sender.dynamic_field_definition()
class_prepared.connect(dynamic_field_definition)


0 commentaires

2
votes

Pourquoi n'essayez-vous pas de faire une classe?

class OwnedModel(NamedModel):
    class Meta(BaseNamedModelMeta):
        verbose_name = 'owned object'


0 commentaires