12
votes

Comment attribuer des objets à l'intérieur d'un objet modèle avec Django?

est-il possible de remplacer les valeurs à l'intérieur d'un modèle? J'obtiens 'MyModel' Object ne prend pas en charge l'affectation des articles. xxx


2 commentaires

Quel est l'objectif que vous essayez d'atteindre?


Juste pour montrer un autre titre dans mon modèle, au cas où cela a été modifié. Ce "autre titre" fetch autre table


3 Réponses :


30
votes

Les modèles sont des objets, pas des dictionnaires. Définissez les attributs sur eux directement: xxx pré>

ou, si le nom de l'attribut est dynamique, utilisez setattr code>: p> xxx pré>

Ceci modifie la copie en mémoire du modèle, mais n'effectue aucune modification de la base de données - pour que votre attribut devrait être un champ et que vous auriez appelé le Enregistrer code> Méthode sur My_Model code>. Vous n'avez pas besoin de le faire si vous voulez simplement modifier ce que le modèle reçoit dans son contexte, mais simplement pour l'amour de l'exhaustivité: p>

mydict = {'title': 'foo'}
# legal
mydict['title'] = 'something'


5 commentaires

OMG, quelle erreur muette! Merci!


En général, les attributs d'objet sont en fait stockés sous forme de dictionnaire ( my_model .__ dict __ , pour ce cas) de sorte que votre intuition n'est pas grave. Mais il existe des raisons très saines de ne pas avoir accès directement à ce dictionnaire.


@Peterdeglopper Je pense que vous devez appeler .Save () afin de mettre à jour un modèle Django.


@GamesBrainiac Si vous souhaitez que les modifications soient enregistrées dans la base de données, oui. J'ai eu l'intention de ma déclaration dans la réponse pour résoudre ce problème: "Ceci modifie la copie en mémoire du modèle, mais ne modifie pas de modifications de base de données - pour que votre attribut devrait être un champ et que vous auriez appelé le Enregistrer méthode. " Pensez-vous que cela manque quelque chose? Je modifierai plus d'informations si nécessaire.


@Peterdeglopper Je pense que votre réponse est parfaite, juste un lien vers des documents de Django serait la cerise sur le dessus! : D Je fais toujours cela, depuis le plus souvent, les docs ont toutes les réponses que vous voulez.



2
votes

Oui, vous pouvez modifier des valeurs, mais ce n'est pas comment c'est fait. Les modèles Django sont des classes Python qui ont des modèles pour représenter des champs. Par exemple, un charfield code> est destiné à détenir une chaîne dans une base de données. Permettez-moi de démontrer ( code de Django Docs ):

if my_model.is_changed:
    my_model.title = "Something"
    my_model.save()


1 commentaires

@Peterdeglopper Merci pour cela, je modifiez une autre question sur un autre forum, alors j'ai passé la mauvaise chose là-bas, et ici! : P



0
votes

my_model est un objet. Alors, essayez ceci: xxx


0 commentaires