Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2023-11-26T23:57:23+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Récupérer proprement des données entrées dans la console, message #2530042023-11-26T23:57:23+01:00lmghs/@lmghshttps://zestedesavoir.com/forums/sujet/17225/recuperer-proprement-des-donnees-entrees-dans-la-console/?page=1#p253004<p>L'<code>ignore</code> n’est <em>nécessaire</em> qu’entre un <code>>></code> et un <code>getline</code>.</p>
<p>Il sera inutile, voire totalement parasite et perturbateur si systématisé sur l’un ou l’autre.</p>
<p>A la limite, il y a <code>>> std::ws</code> comme indiqué dans la FAQ. A vu de nez, on doit pouvoir le systématiser sur l’extraction avec <code>>></code> — jamais réfléchi plus de 30s à la question.</p>Récupérer proprement des données entrées dans la console, message #2529892023-11-25T00:36:13+01:00dalfab/@dalfabhttps://zestedesavoir.com/forums/sujet/17225/recuperer-proprement-des-donnees-entrees-dans-la-console/?page=1#p252989<p>Bonjour,</p>
<p>Pour ne pas se compliquer la vie avec les flux, il faut éviter de les mettre en condition d’erreur. Ca évite aussi les <code>cin.clear()</code> et <code>cin.ignore()</code> pas simples à utiliser.</p>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span></div><pre><code class="hljs language-cpp"><span class="hljs-built_in">flush</span>( std::cout << <span class="hljs-string">"Entrer un entier : "</span> );
std::string line;
std::<span class="hljs-built_in">getline</span>( std::cin, line ); <span class="hljs-comment">// extraire toute la ligne</span>
<span class="hljs-function">std::istringstream <span class="hljs-title">ss</span><span class="hljs-params">( line )</span></span>;
<span class="hljs-keyword">int</span> val;
<span class="hljs-keyword">if</span> ( ss >> val ) {
<span class="hljs-built_in">endl</span>( std::cout << <span class="hljs-string">"L'entier : "</span> << val << <span class="hljs-string">" a été saisi"</span> );
}
<span class="hljs-keyword">else</span> {
<span class="hljs-built_in">endl</span>( std::cout << <span class="hljs-string">"Erreur, vous n'avez pas saisi un entier"</span> );
}
<span class="hljs-comment">// le flux std::cin est toujours valide pour extraire une ligne</span>
<span class="hljs-built_in">flush</span>( std::cout << <span class="hljs-string">"Entrer une chaîne : "</span> );
std::<span class="hljs-built_in">getline</span>( std::cin, line ); <span class="hljs-comment">// extraire toute la ligne</span>
<span class="hljs-built_in">endl</span>( std::cout << <span class="hljs-string">"La chaîne : "</span> << std::<span class="hljs-built_in">qoted</span>(line) << <span class="hljs-string">" a été saisie"</span> );
</code></pre></div>
<p>De la même manière avec <code>std::cout</code> dans une fonction, on peut passer par <code>std::ostringstream</code>. Ainsi une modification de format ne viendra pas "polluer" le format par défaut de <code>std::cout</code>.</p>Récupérer proprement des données entrées dans la console, message #2529812023-11-24T11:18:03+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17225/recuperer-proprement-des-donnees-entrees-dans-la-console/?page=1#p252981<p>Je suis d’accord que les programmes consoles sont plus généralement manipulés au travers leurs arguments.</p>
<p>Si tu souhaites vraiment faire un programme interactif dans le terminal tel que "top" par exemple, il existe des libs <a href="https://en.wikipedia.org/wiki/Text-based_user_interface">TUI</a> comme ncurses.</p>
<p>Le soucis d’utiliser cin/cout pour faire de l’interactif est que ce ne sont que des flux. Tu vas concevoir ton appli comme un dialogue alors qu’en fait l’utilisateur pourra juste envoyer un fichier dans le flux au lieu de son clavier et ça n’aura plus aucun sens. Et en plus tu n’as aucun contrôle sur l’affichage.</p>
<p>Si, pour diverses raisons, tu veux continuer d’utiliser cin/cout pour faire un programme interactif, j’ai l’impression que ce qu’il te manque c’est juste de finir de consommer la ligne dans chaque cas.</p>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span></div><pre><code class="hljs language-cpp">std::cout << <span class="hljs-string">"saisir i1 : "</span>;
<span class="hljs-keyword">int</span> i1 = <span class="hljs-number">0</span>;
<span class="hljs-keyword">while</span> (!(std::cin >> i1)) { <span class="hljs-comment">// On vérifie qu'on lit bien un entier</span>
<span class="hljs-keyword">if</span> (std::cin.<span class="hljs-built_in">eof</span>()) {
<span class="hljs-comment">// fin du flux, interrompre le programme ?</span>
<span class="hljs-keyword">break</span>; <span class="hljs-comment">// en tout cas ne pas rester coincé ici</span>
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (std::cin.<span class="hljs-built_in">fail</span>()) {
std::cin.<span class="hljs-built_in">clear</span>(); <span class="hljs-comment">// on réinitialise l'erreur puisqu'on la traite</span>
<span class="hljs-comment">// on vide le contenu erroné</span>
std::cin.<span class="hljs-built_in">ignore</span>(std::numeric_limits<std::streamsize>::<span class="hljs-built_in">max</span>(), <span class="hljs-string">'\n'</span>);
<span class="hljs-comment">// on prévient l'utilisateur</span>
std::cout << <span class="hljs-string">"Saisie invalide, veuillez saisir à nouveau : "</span>;
}
}
<span class="hljs-comment">// on finit de consommer la ligne, car '23 ans' est une entrée valide par</span>
<span class="hljs-comment">// exemple, et on ne veut pas laisser ' ans' à la lecture suivante</span>
std::cin.<span class="hljs-built_in">ignore</span>(std::numeric_limits<std::streamsize>::<span class="hljs-built_in">max</span>(), <span class="hljs-string">'\n'</span>);
std::cout << <span class="hljs-string">"i1 = "</span> << i1 << std::endl;
std::cout << <span class="hljs-string">"saisir str1 : "</span>;
std::string str1{};
std::<span class="hljs-built_in">getline</span>(std::cin, str1);
std::cout << <span class="hljs-string">"str1 = "</span> << str1 << std::endl;
std::cout << <span class="hljs-string">"saisir str2 : "</span>;
std::string str2{};
std::<span class="hljs-built_in">getline</span>(std::cin, str2);
std::cout << <span class="hljs-string">"str2 = "</span> << str2 << std::endl;
std::cout << <span class="hljs-string">"saisir i2 : "</span>;
<span class="hljs-keyword">int</span> i2 = <span class="hljs-number">0</span>;
<span class="hljs-keyword">while</span> (!(std::cin >> i2)) { <span class="hljs-comment">// On vérifie qu'on lit bien un entier</span>
<span class="hljs-keyword">if</span> (std::cin.<span class="hljs-built_in">eof</span>()) {
<span class="hljs-comment">// fin du flux, interrompre le programme ?</span>
<span class="hljs-keyword">break</span>; <span class="hljs-comment">// en tout cas ne pas rester coincé ici</span>
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (std::cin.<span class="hljs-built_in">fail</span>()) {
std::cin.<span class="hljs-built_in">clear</span>(); <span class="hljs-comment">// on réinitialise l'erreur puisqu'on la traite</span>
<span class="hljs-comment">// on vide le contenu erroné</span>
std::cin.<span class="hljs-built_in">ignore</span>(std::numeric_limits<std::streamsize>::<span class="hljs-built_in">max</span>(), <span class="hljs-string">'\n'</span>);
<span class="hljs-comment">// on prévient l'utilisateur</span>
std::cout << <span class="hljs-string">"Saisie invalide, veuillez saisir à nouveau : "</span>;
}
}
<span class="hljs-comment">// on finit de consommer la ligne, car '23 ans' est une entrée valide par</span>
<span class="hljs-comment">// exemple, et on ne veut pas laisser ' ans' à la lecture suivante</span>
std::cin.<span class="hljs-built_in">ignore</span>(std::numeric_limits<std::streamsize>::<span class="hljs-built_in">max</span>(), <span class="hljs-string">'\n'</span>);
std::cout << <span class="hljs-string">"i2 = "</span> << i2 << std::endl;
</code></pre></div>
<p>(évidemment tu peux mettre la saisie d’un entier dans une fonction)</p>Récupérer proprement des données entrées dans la console, message #2529772023-11-23T22:39:11+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/17225/recuperer-proprement-des-donnees-entrees-dans-la-console/?page=1#p252977<p>Pourquoi pas plutôt un programme qui se lance avec des paramètres ? Un truc qui se lancerait d’une ou plusieurs des façons suivantes :</p>
<div class="hljs-code-div hljs-code-bash"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span></div><pre><code class="hljs language-bash">$ mon_programme -c <span class="hljs-string">"ma_chaine"</span> -i 42
> …
$ mon_programme -i 42
> …
$ mon_programme -c <span class="hljs-string">"ma_chaine"</span>
> …
$ mon_programme --text_file <span class="hljs-string">"/home/donald/dossier à ranger/arguments.txt"</span>
> …
$ mon programme --<span class="hljs-built_in">help</span>
> …
</code></pre></div>
<p>Comme la plupart des programme en Bash en fait.
Tu aurais juste à récupérer les paramètres passés par l’utilisateur. C’est un peu plus propre que les <code>cin</code> à la chaîne, qui obligent l’utilisateur à tout recommencer depuis le début à la moindre faute de frappe.</p>Récupérer proprement des données entrées dans la console, message #2529652023-11-23T17:56:00+01:00Kev_k/@Kev_khttps://zestedesavoir.com/forums/sujet/17225/recuperer-proprement-des-donnees-entrees-dans-la-console/?page=1#p252965<p>Salut à tout le monde <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>
<p>Je voudrais avoir vos retours et conseilles.
J’ai une petite application qui fonctionne en console et mon problème se situe au niveau de la récupération d’une donnée entrée dans la console. Pour récupérer un integer j’utilise tout simplement un std: :cin» et pour récupérer un string, j’utilise un std: : getline(). L’application permet de manager des cours et les informations des étudiants. Il y a différentes fonctionnalités et chacune d’entre elles récupère soit un integer entré par l’utilisateur dans la console soit un string ou les 2.</p>
<p>Je voudrais savoir comment récupérer la donnée entrée dans la console de <strong>manière propre et peu importe l’ordre</strong>.</p>
<p>Quelques exemples de problèmes que j’ai rencontrés</p>
<ul>
<li>Récupérer un integer avant un string : l’instruction pour récupérer le string n’est pas exécutée. Pour pallier à cela, j’ai utilisé le std::cin.ignore() avant le std::getline() pour récupérer le string. Mais cela a conduit au problème suivant.</li>
<li>Récupérer 2 strings l’un après l’autre avec un std::cin.ignore() entre les 2. Le code qui suit est un exemple du cas présent et selon la position du std::cin.ignore() et les arguments, le résultat n’est pas satisfaisant.</li>
</ul>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span></div><pre><code class="hljs language-cpp">std::string str{};
std::string str2{};
<span class="hljs-comment">/*bout de code exécuté par une fonction x*/</span>
std::cout << <span class="hljs-string">"entrez str:"</span> << std::endl;
std::<span class="hljs-built_in">getline</span>(std::cin, str);
std::cout << <span class="hljs-string">"str = "</span> << str << std::endl;
<span class="hljs-comment">/*bout de code exécuté par une fonction y appelée directement après l'exécution de la fonction x*/</span>
std::cin.<span class="hljs-built_in">ignore</span>(); <span class="hljs-comment">// pour pallier le premier problème si la fonction x récupère un integer</span>
<span class="hljs-comment">//std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');</span>
std::cout << <span class="hljs-string">"entrer str2:"</span> << std::endl;
<span class="hljs-comment">//std::cin.ignore();</span>
<span class="hljs-comment">//std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');</span>
std::<span class="hljs-built_in">getline</span>(std::cin, str2);
std::cout <<<span class="hljs-string">"str2 = "</span> << str2 << std::endl;
</code></pre></div>
<p>Merci d’avance pour vos retours <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>Convesion de type et constructeur de conversion avec std::string, message #2520322023-09-11T11:06:24+02:00MichelBillaud/@MichelBillaudhttps://zestedesavoir.com/forums/sujet/17131/convesion-de-type-et-constructeur-de-conversion-avec-stdstring/?page=1#p252032<figure><blockquote>
<p>Edit: le constructeur ligne 51 est celui utilisant un <code>std::initializer_list<char></code>.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17131/convesion-de-type-et-constructeur-de-conversion-avec-stdstring/?page=1#p251963">Berdes</a></figcaption></figure>
<p>Le nombre qui est reçu est la <em>valeur numérique</em> du caractère. Exemple</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span></div><pre><code class="hljs language-text">int main()
{
std::string str {65};
std::cout << "chaine = " << str << std::endl;
}
</code></pre></div>
<p>affiche "chaine = A" (et pas 65, la chaine qui représente en décimal la valeur 65)</p>Convesion de type et constructeur de conversion avec std::string, message #2520182023-09-10T04:25:49+02:00Kev_k/@Kev_khttps://zestedesavoir.com/forums/sujet/17131/convesion-de-type-et-constructeur-de-conversion-avec-stdstring/?page=1#p252018<p>Salut salut <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>
<p>Un très grand merci pour les réponses. Grâce à elles et à quelques recherches, j’arrive à voire plus clairement le comportement de mon code.</p>
<p>Grand merci <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>Convesion de type et constructeur de conversion avec std::string, message #2519632023-09-05T20:19:52+02:00Berdes/@Berdeshttps://zestedesavoir.com/forums/sujet/17131/convesion-de-type-et-constructeur-de-conversion-avec-stdstring/?page=1#p251963<p>Bonjour,</p>
<p>Grossièrement, un <code>char</code> et un <code>int</code>, c’est la même chose pour le compilateur. Ça explique pourquoi la ligne 29 ne pose pas de problème.</p>
<p>Les lignes 43 et 49 ont le même problème : pour construire un <code>joueur</code>, il te faut une <code>std::string</code>, mais <code>std::string</code> n’a pas de constructeur <strong>implicite</strong> à partir de <code>int</code>.</p>
<p>La ligne 51 fonctionne parce que <code>std::string</code> a un constructeur <strong>explicite</strong> qui prend un <code>int</code> en entrée. Enfin, je suppose, je ne vois pas quel constructeur est utilisé et je suis pas sur mon ordinateur pour tester.</p>
<p>Edit: le constructeur ligne 51 est celui utilisant un <code>std::initializer_list<char></code>.</p>Convesion de type et constructeur de conversion avec std::string, message #2519622023-09-05T20:18:02+02:00entwanne/@entwannehttps://zestedesavoir.com/forums/sujet/17131/convesion-de-type-et-constructeur-de-conversion-avec-stdstring/?page=1#p251962<p>Salut,</p>
<p>La ligne 29 passe parce que tu initialises ton nombre complexe avec un nombre (<code>'c'</code> est un <code>char</code> donc un nombre) alors que la ligne 43 est invalide (tu essaies de traiter un nombre comme une <em>string</em>).</p>
<p>Pour la ligne 51 j’imagine que c’est le constructeur de <em>string</em> qui fournit une conversion pour ce cas, alors que tu t’en as pas sur ta classe <code>joueur</code>.</p>Convesion de type et constructeur de conversion avec std::string, message #2519612023-09-05T20:00:46+02:00Kev_k/@Kev_khttps://zestedesavoir.com/forums/sujet/17131/convesion-de-type-et-constructeur-de-conversion-avec-stdstring/?page=1#p251961<p>Salut à tous <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>
<p>Pour mon apprentissage, je fais quelques petits tests par curiosité. Actuellement, je me retrouve avec un comportement du constructeur de conversion que je n’arrive pas à expliquer.
Le bout de code est le suivant :</p>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span><span data-count="48"></span><span data-count="49"></span><span data-count="50"></span><span data-count="51"></span><span data-count="52"></span><span data-count="53"></span><span data-count="54"></span><span data-count="55"></span></div><pre><code class="hljs language-cpp"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><iostream></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><string></span></span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">joueur</span> {</span>
<span class="hljs-keyword">public</span> :
<span class="hljs-built_in">joueur</span>(std::string);
std::string _nom;
};
joueur::<span class="hljs-built_in">joueur</span>(std::string n ): _nom(n) {
std::cout << <span class="hljs-string">"In Constructor: nom = "</span> << _nom << std::endl;}
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">complexe</span> {</span>
<span class="hljs-keyword">int</span> reel;
<span class="hljs-keyword">int</span> imag;
<span class="hljs-keyword">public</span>:
<span class="hljs-built_in">complexe</span>(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b) : <span class="hljs-built_in">reel</span>(a), <span class="hljs-built_in">imag</span>(b) {}
<span class="hljs-comment">/*explicit*/</span> <span class="hljs-built_in">complexe</span>(<span class="hljs-keyword">int</span> a) : <span class="hljs-built_in">reel</span>(a), <span class="hljs-built_in">imag</span>(<span class="hljs-number">0</span>) {}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">affiche</span> <span class="hljs-params">()</span> </span>{std::cout << <span class="hljs-string">"[ "</span><< reel<< <span class="hljs-string">" "</span> << imag << <span class="hljs-string">"]"</span> <<std::endl ;}
};
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{
<span class="hljs-function">complexe <span class="hljs-title">c1</span> <span class="hljs-params">(<span class="hljs-number">2</span>,<span class="hljs-number">3</span>)</span></span>;
c1.<span class="hljs-built_in">affiche</span>();
c1 = <span class="hljs-number">6</span>;
c1.<span class="hljs-built_in">affiche</span>();
c1 = <span class="hljs-string">'c'</span>;
c1.<span class="hljs-built_in">affiche</span>();
complexe c2{<span class="hljs-string">'5'</span>, <span class="hljs-string">'9'</span>};
c2.<span class="hljs-built_in">affiche</span>();
complexe c3{<span class="hljs-number">-20</span>};
c3.<span class="hljs-built_in">affiche</span>();
complexe c4{<span class="hljs-string">'5'</span>};
c4.<span class="hljs-built_in">affiche</span>();
joueur joueur_1{<span class="hljs-string">"pierre"</span>};
std::cout << <span class="hljs-string">"joueur_1.nom = "</span> << joueur_1._nom << std::endl;
joueur_1 = <span class="hljs-number">5</span>;
std::cout << <span class="hljs-string">"joueur_1.nom = "</span> << joueur_1._nom << std::endl;
std::string n{<span class="hljs-string">"bonjour"</span>} ;
n = <span class="hljs-number">5</span>;
joueur joueur_2{<span class="hljs-number">32</span>};
std::string n2{<span class="hljs-number">26</span>} ;
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre></div>
<p>La ligne 43 renvoie l’erreur <code>error: no match for 'operator=' (operand types are 'joueur' and 'int')</code> alors que la ligne 29 passe sans avertissement. Quant à la ligne 49, elle renvoie l’erreur <code>error: no matching function for call to 'joueur::joueur()</code> alors que la ligne 51 elle aussi compile sans avertissement.</p>
<p>Je voudrais s’il vous plaît savoir pourquoi est ce qu’avec la classe <code>joueur </code>la conversion de type n’est pas possible ?</p>
<p>J’utilise VS Code avec le compilateur mingw64 version 12.2.0</p>
<p>Merci d’avance pour vos retours <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>[Django] Union avec annotation, message #2478582022-12-24T06:52:17+01:00Armand75001/@Armand75001https://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247858<p>À votre attention !
Je viens en témoignage sur se site pour vous raconter comment je suis tombé sur
M. Lahuppe Philippe
J’étais à la recherche d’un prêt entre particulier pour finaliser la construction de ma maison vu que ce n’est pas facile avec les banques de faire un prêt.
C’est ainsi que j’ai visiter un site pour avoir de notions concernant le système de prêt entre particulier. A ma grande surprise beaucoup de personnes ont bénéficiés de ses offres de prêt. J’ai donc pris son contact mail sur lequel j’ai essayer de la contacté pour un prêt de 8.000€.
Dans les brefs délais j’ai réellement reçu la somme demandée avec un taux d’intérêt convenable.
Voilà en quelques lignes comment je suis sur M. Lahuppe Philippe
Voici donc son e-mail : <a href="mailto:contactsfinances@gmail.com">contactsfinances@gmail.com</a>
Voici donc son e-mail : <a href="mailto:contactsfinances@gmail.com">contactsfinances@gmail.com</a>
Voici donc son e-mail : <a href="mailto:contactsfinances@gmail.com">contactsfinances@gmail.com</a></p>
<p>N°: ( +33 ) 0756914547
N°: ( +33 ) 0756914547</p>[Django] Union avec annotation, message #2478412022-12-23T19:24:47+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247841<p>Pas bête. Je viens de tester avec <code>return chain(articles, news, webmarks)</code> et ça a l’air de fonctionner normalement.
Merci.</p>[Django] Union avec annotation, message #2478172022-12-23T09:03:33+01:00entwanne/@entwannehttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247817<p>Du coup ça oblige la méthode <code>items</code> à charger en mémoire l’ensemble des flux alors que précédemment c’était la DB qui gérait ça.</p>
<p>Tu peux peut-être te débrouiller avec un <code>itertools.chain</code> pour simplement renvoyer un itérateur sur les résultats (à voir si ça ne pose pas de problème avec le curseur DB) mais sinon ça m’étonne qu’il n’y ait pas moyen de calculer l’union de tout cela.</p>[Django] Union avec annotation, message #2478132022-12-22T19:24:34+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247813<p>C’est bon, j’ai trouvé la solution ! C’est très bêtes en fait. Il n’y a pas besoin de faire d’union :</p>
<div class="hljs-code-div hljs-code-Python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span></div><pre><code class="hljs language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RssBlogFeed</span>(<span class="hljs-params">BaseRssFeed</span>):</span>
title = <span class="hljs-string">"Blog"</span>
link = <span class="hljs-string">"http://127.0.0.1:8000/blog/"</span>
description = <span class="hljs-string">"Dernieres publications"</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">items</span>(<span class="hljs-params">self</span>):</span>
articles = Article.objects.<span class="hljs-built_in">filter</span>(hidden=<span class="hljs-literal">False</span>)
webmarks = Webmark.objects.<span class="hljs-built_in">all</span>()
news = New.objects.<span class="hljs-built_in">all</span>()
<span class="hljs-keyword">return</span> *articles, *webmarks, *news
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_author_name</span>(<span class="hljs-params">self, item</span>):</span>
<span class="hljs-keyword">try</span>:
<span class="hljs-keyword">return</span> item.author
<span class="hljs-keyword">except</span> AttributeError:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_pubdate</span>(<span class="hljs-params">self, item</span>):</span>
<span class="hljs-keyword">return</span> item.last_mod_date
</code></pre></div>
<p>Du coup les items ne sont pas triés, mais de toute manière le tri se fera directement dans l’agrégateur.</p>
<p>Et le order(['title']) n’as aucune importance.
Merci de votre aides en tout cas.</p>[Django] Union avec annotation, message #2478122022-12-22T18:59:29+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247812<p>Ok, il semblerai que le feed fasse uniquement appel au <code>get_absolute_url</code> de la classe à l’origine de l’union (ici <code>Article.get_absolute_url()</code>). Et les agrégateurs de flux n’acceptent pas plusieurs fois le même item_link.</p>
<p>Bon, je pensais pas que ce serait aussi compliqué de cummuler plusieurs flux…</p>[Django] Union avec annotation, message #2478112022-12-22T17:52:14+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247811<blockquote>
<blockquote>
<p>En fait je me demande si l’ordre d’apparition n’est pas celui du model, en non celui qui est décrit dans only.</p>
<p>— 1e49ba0eba</p>
</blockquote>
</blockquote>
<blockquote>
<p>C’est exactement cela.</p>
<p> — Gil Cot</p>
</blockquote>
<p>Après test, c’est bien un problème d’ordre d’apparition des champs dans les modèles. J’ai changé mis <code>author</code> après <code>last_mod_date</code> dans <code>Article</code> et j’ai modifié mon feed :</p>
<div class="hljs-code-div hljs-code-Python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span></div><pre><code class="hljs language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ArticleBase</span>(<span class="hljs-params">models.Model</span>):</span>
<span class="hljs-string">"""Abstract class for drafts and articles."""</span>
title = models.CharField(max_length=<span class="hljs-number">50</span>, unique=<span class="hljs-literal">True</span>)
slug = models.SlugField(null=<span class="hljs-literal">False</span>, blank=<span class="hljs-literal">True</span>, unique=<span class="hljs-literal">True</span>)
<span class="hljs-comment"># author = models.CharField(max_length=64)</span>
md_description = MarkdownxField(max_length=<span class="hljs-number">256</span>, blank=<span class="hljs-literal">True</span>)
_html_description = models.TextField(blank=<span class="hljs-literal">True</span>,
db_column=<span class="hljs-string">"html_description"</span>,
editable=<span class="hljs-literal">False</span>)
md_body = MarkdownxField(blank=<span class="hljs-literal">True</span>)
_html_body = models.TextField(blank=<span class="hljs-literal">True</span>, db_column=<span class="hljs-string">"html_body"</span>,
editable=<span class="hljs-literal">False</span>)
creation_date = models.DateTimeField(<span class="hljs-string">"Creation"</span>, auto_now_add=<span class="hljs-literal">True</span>)
last_mod_date = models.DateTimeField(<span class="hljs-string">"Last modification"</span>, auto_now=<span class="hljs-literal">True</span>)
<span class="hljs-comment"># Déplacé après last_mod_date :</span>
author = models.CharField(max_length=<span class="hljs-number">64</span>)
tags = TaggableManager()
files = models.ManyToManyField(<span class="hljs-string">"File"</span>, blank=<span class="hljs-literal">True</span>)
</code></pre></div>
<div class="hljs-code-div hljs-code-Python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span></div><pre><code class="hljs language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RssBlogFeed</span>(<span class="hljs-params">BaseRssFeed</span>):</span>
title = <span class="hljs-string">"Blog"</span>
link = <span class="hljs-string">"http://127.0.0.1:8000/blog/"</span>
description = <span class="hljs-string">"Dernieres publications"</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">items</span>(<span class="hljs-params">self, publication</span>):</span>
articles = Article.objects.only(
<span class="hljs-string">'title'</span>,
<span class="hljs-string">'_html_description'</span>,
<span class="hljs-string">'last_mod_date'</span>, <span class="hljs-comment"># changement de champ</span>
<span class="hljs-string">'author'</span>).<span class="hljs-built_in">filter</span>(hidden=<span class="hljs-literal">False</span>)
author = Value(<span class="hljs-string">"moi"</span>, CharField(max_length=<span class="hljs-number">64</span>))
webmarks = Webmark.objects.only(
<span class="hljs-string">'title'</span>,
<span class="hljs-string">'_html_description'</span>,
<span class="hljs-string">'pub_date'</span>).annotate(author=author).order_by(<span class="hljs-string">'-pub_date'</span>)
news = New.objects.only(
<span class="hljs-string">'title'</span>,
<span class="hljs-string">'_html_description'</span>,
<span class="hljs-string">'pub_date'</span>).annotate(author=author).order_by(<span class="hljs-string">'-pub_date'</span>)
<span class="hljs-keyword">return</span> articles.union(webmarks, news).order_by(<span class="hljs-string">'-last_mod_date'</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_author_name</span>(<span class="hljs-params">self, item</span>):</span>
<span class="hljs-keyword">return</span> item.author
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_pubdate</span>(<span class="hljs-params">self, item</span>):</span>
<span class="hljs-keyword">return</span> item.last_mod_date
</code></pre></div>
<p>Ça ne plante plus.</p>
<p>Mais…</p>
<p>Lorsque j’ajoute le feed à mon aggrégateur de flux, seuls les articles sont visibles.</p>
<p>Pourtant si je rajoute un <code>print(item)</code> dans <code>def item_author_name(self, item)</code> ou <code>def item_pubdate(self, item)</code>, toutes les publications sont passées dans ces fonctions. Je ne comprends pas…</p>
<p>Sinon :</p>
<blockquote>
<p>Par contre, webmarks est trié sur un champ texte (ligne 54) tandis que news est trié sur un champ horodatage (ligne 64) …et il n’arrive pas à réconcilier cela (les ORM ont leurs limites dans le SQL généré ; à coup sûr il fait juste l’union des deux requêtes qui ont chacune leur ordre de tri, alors qu’il faudrait regrouper les tris à la fin)</p>
<p>— Gil Cot</p>
</blockquote>
<p>Là par contre, je ne te suis pas. Ça c’est l’ordre de tri des entités, pas des champs. Au pire, en admettant que le <code>order_by</code> (ligne 25, premier post) ne fonctionne pas, j’aurai les publications dans le désordre, ce qui n’est pas le cas ici. Ou j’ai mal compris ? Quoi qu’il en soit, j’ai remis <code>-pub_date</code> pour l’ordre de tri, le temps de debugguer mon machin.</p>[Django] Union avec annotation, message #2478082022-12-22T16:18:42+01:00Gil Cot/@Gil%20Cothttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247808<p>Nos réponses se sont encore croisées. </p>
<figure><blockquote>
<p>En fait je me demande si l’ordre d’apparition n’est pas celui du model, en non celui qui est décrit dans <code>only</code>. </p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/#p247807">1e49ba0eba</a></figcaption></figure>
<p>C’est exactement cela.</p>
<figure><blockquote>
<p>Par contre, <code>webmarks</code> est trié sur un champ texte (ligne 54) tandis que <code>news</code> est trié sur un champ horodatage (ligne 64) …et il n’arrive pas à réconcilier cela (les ORM ont leurs limites dans le SQL généré ; à coup sûr il fait juste l’union des deux requêtes qui ont chacune leur ordre de tri, alors qu’il faudrait regrouper les tris à la fin) </p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/#p247804">Gil Cot</a></figcaption></figure>
<p>Le problème est identifié. La solution par contre, je ne sais pas… </p>
<figure><blockquote>
<p>Mais dans ce cas je ne sais pas trop comment le changer, sauf à supprimer l’héritage. Il n’y a pas un moyen de garantir l’ordre des champs ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/#p247807">1e49ba0eba</a></figcaption></figure>
<p>Actuellement l’ordre de chacun est garanti car contraint par l’héritage. Tu devrais pouvoir réorganiser dans ton flux mais le gros souci est surtout que tu as deux tris (type et noms de colonnes) concurrents… Essaye peut-être un tri sur les deux ? <code>order_by('title,-pub_date')</code></p>[Django] Union avec annotation, message #2478072022-12-22T16:10:42+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247807<blockquote>
<p>Soit j’ai mal lu, mais il n’y a pas de pub_date dans webmarks si ?</p>
</blockquote>
<p>Si. Webmark hérite de <code>Link</code></p>
<blockquote>
<p>Et dans ce cas, il faut que query1 et query2 renvoient le même nombre de champs et que ces champs/colonnes soient de même type dans leur ordre d’apparition</p>
</blockquote>
<p>Oui, oui j’ai bien compris. En fait je me demande si l’ordre d’apparition n’est pas celui du model, en non celui qui est décrit dans <code>only</code>. Mais dans ce cas je ne sais pas trop comment le changer, sauf à supprimer l’héritage. Il n’y a pas un moyen de garantir l’ordre des champs ?</p>[Django] Union avec annotation, message #2478042022-12-22T15:18:44+01:00Gil Cot/@Gil%20Cothttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247804<p>Je rejoins <strong>elegance</strong> à défaut d’avoir plus d’info sur les classes mères comme le demande <strong>entwanne</strong>. Il s’agit visiblement d’une opération d’ORM qui se traduit en SQL par </p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">SELECT</span> query1
<span class="hljs-keyword">UNION</span>
<span class="hljs-keyword">SELECT</span> query2
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> somefield
</code></pre></div>
<p>Et dans ce cas, il faut que <code>query1</code> et <code>query2</code> renvoient le même nombre de champs et que ces champs/colonnes soient de même type dans leur ordre d’apparition… Regarde <a href="https://www.w3schools.com/sql/sql_union.asp">les exemples de w3schools</a> pour en savoir plus sur cette clause. </p>
<hr>
<p>Édition (nos messages se sont croisés)</p>
<blockquote>
<p>Oui, c’est ça. Le problème vient du champ <code>author</code> qui n’existe pas pour les webmarks et les news. Du coup, j’ai essayé de leur mettre une valeur par défaut avec <code>annotate</code>. L’attribut <code>author</code> est bien ajouté (j’ai fait le test avec un <code>print</code>, mais ça ne lui convient pas pour l’union.</p>
</blockquote>
<p>Soit j’ai mal lu, mais il n’y a pas de <code>pub_date</code> dans <code>webmarks</code> si ?</p>
<p>Reédition (toujours bien lire avant de répondre)</p>
<p>Les <code>pub_date</code> sont lignes 28–29 et 44.<br>
Par contre, <code>webmarks</code> est trié sur un champ texte (ligne 54) tandis que <code>news</code> est trié sur un champ horodatage (ligne 64)
…et il n’arrive pas à réconcilier cela (les ORM ont leurs limites dans le SQL généré ; à coup sûr il fait juste l’union des deux requêtes qui ont chacune leur ordre de tri, alors qu’il faudrait regrouper les tris à la fin) </p>[Django] Union avec annotation, message #2478032022-12-22T15:13:51+01:001e49ba0eba/@1e49ba0ebahttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247803<blockquote>
<p>quelle est cette classe <code>BaseRssFeed</code></p>
</blockquote>
<p>C’est juste une classe abstraite pour factoriser un peu les différents types de flux :</p>
<div class="hljs-code-div hljs-code-Python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span></div><pre><code class="hljs language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseRssFeed</span>(<span class="hljs-params">Feed</span>):</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_title</span>(<span class="hljs-params">self, obj</span>):</span>
<span class="hljs-keyword">return</span> obj.title
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_description</span>(<span class="hljs-params">self, obj</span>):</span>
<span class="hljs-keyword">return</span> obj.description
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">item_pubdate</span>(<span class="hljs-params">self, item</span>):</span>
<span class="hljs-keyword">return</span> item.pub_date
</code></pre></div>
<blockquote>
<p>que contiennent tes modèles <code>Article</code>, <code>Webmark</code> et <code>News</code></p>
</blockquote>
<p>Les champs <code>title</code>, <code>_html_description</code> et <code>pub_date</code> sont communs aux trois modèles. <code>Article</code> contient en plus un champ <code>author</code>. Ensuite ils contiennent tous d’autres champs, qui ne nous intéresse pas forcément ici.</p>
<p>Webmark est une liste de liens web dignes d’intéret. News est très proche, mais fonctionne plus comme un fil d’actualités.</p>
<div class="hljs-code-div hljs-code-Python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span><span data-count="48"></span><span data-count="49"></span><span data-count="50"></span><span data-count="51"></span><span data-count="52"></span><span data-count="53"></span><span data-count="54"></span><span data-count="55"></span><span data-count="56"></span><span data-count="57"></span><span data-count="58"></span><span data-count="59"></span><span data-count="60"></span><span data-count="61"></span><span data-count="62"></span><span data-count="63"></span><span data-count="64"></span><span data-count="65"></span><span data-count="66"></span><span data-count="67"></span><span data-count="68"></span><span data-count="69"></span><span data-count="70"></span><span data-count="71"></span><span data-count="72"></span><span data-count="73"></span></div><pre><code class="hljs language-Python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ArticleBase</span>(<span class="hljs-params">models.Model</span>):</span>
<span class="hljs-string">"""Abstract class for drafts and articles."""</span>
title = models.CharField(max_length=<span class="hljs-number">50</span>, unique=<span class="hljs-literal">True</span>)
slug = models.SlugField(null=<span class="hljs-literal">False</span>, blank=<span class="hljs-literal">True</span>, unique=<span class="hljs-literal">True</span>)
author = models.CharField(max_length=<span class="hljs-number">64</span>)
md_description = MarkdownxField(max_length=<span class="hljs-number">256</span>, blank=<span class="hljs-literal">True</span>)
_html_description = models.TextField(blank=<span class="hljs-literal">True</span>,
db_column=<span class="hljs-string">"html_description"</span>,
editable=<span class="hljs-literal">False</span>)
md_body = MarkdownxField(blank=<span class="hljs-literal">True</span>)
_html_body = models.TextField(blank=<span class="hljs-literal">True</span>, db_column=<span class="hljs-string">"html_body"</span>,
editable=<span class="hljs-literal">False</span>)
creation_date = models.DateTimeField(<span class="hljs-string">"Creation"</span>, auto_now_add=<span class="hljs-literal">True</span>)
last_mod_date = models.DateTimeField(<span class="hljs-string">"Last modification"</span>, auto_now=<span class="hljs-literal">True</span>)
tags = TaggableManager()
files = models.ManyToManyField(<span class="hljs-string">"File"</span>, blank=<span class="hljs-literal">True</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
abstract = <span class="hljs-literal">True</span>
ordering = [<span class="hljs-string">'-last_mod_date'</span>]
[…]
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Article</span>(<span class="hljs-params">ArticleBase</span>):</span>
<span class="hljs-string">"""Published articles."""</span>
pub_date = models.DateTimeField(<span class="hljs-string">"Publication"</span>,
auto_now_add=<span class="hljs-literal">True</span>)
hidden = models.BooleanField(default=<span class="hljs-literal">False</span>)
comments_deactivated = models.BooleanField(default=<span class="hljs-literal">False</span>)
comments_closed = models.BooleanField(default=<span class="hljs-literal">False</span>)
[…]
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Link</span>(<span class="hljs-params">models.Model</span>):</span>
url = models.URLField(max_length=<span class="hljs-number">256</span>)
title = models.CharField(max_length=<span class="hljs-number">256</span>)
slug = models.SlugField(null=<span class="hljs-literal">False</span>, blank=<span class="hljs-literal">True</span>, unique=<span class="hljs-literal">True</span>)
md_description = MarkdownxField()
_html_description = models.TextField(blank=<span class="hljs-literal">True</span>,
db_column=<span class="hljs-string">"html_description"</span>,
editable=<span class="hljs-literal">False</span>)
pub_date = models.DateTimeField(<span class="hljs-string">"Publication"</span>, auto_now_add=<span class="hljs-literal">True</span>)
tags = TaggableManager()
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
abstract = <span class="hljs-literal">True</span>
[…]
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Webmark</span>(<span class="hljs-params">Link</span>):</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>(<span class="hljs-params">Link.Meta</span>):</span>
ordering = [<span class="hljs-string">"title"</span>]
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_absolute_url</span>(<span class="hljs-params">self</span>):</span>
<span class="hljs-keyword">return</span> reverse(<span class="hljs-string">"blog:webmark_detail"</span>, kwargs={<span class="hljs-string">"slug"</span>: self.slug})
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">New</span>(<span class="hljs-params">Link</span>):</span>
bookmarked = models.BooleanField(default=<span class="hljs-literal">False</span>)
expiration_date = models.DateTimeField(blank=<span class="hljs-literal">True</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>(<span class="hljs-params">Link.Meta</span>):</span>
ordering = [<span class="hljs-string">"-pub_date"</span>]
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">save</span>(<span class="hljs-params">self, *args, **kwargs</span>):</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.expiration_date:
self.expiration_date = datetime.datetime.now() + datetime.timedelta(
days=Config.default_news_storage_duration)
<span class="hljs-built_in">super</span>().save(*args, **kwargs)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_absolute_url</span>(<span class="hljs-params">self</span>):</span>
<span class="hljs-keyword">return</span> reverse(<span class="hljs-string">"blog:new_detail"</span>, kwargs={<span class="hljs-string">"slug"</span>: self.slug})
</code></pre></div>
<blockquote>
<p>qu’est-ce que <code>Value</code></p>
</blockquote>
<p>À oui, pardon : il y a un <code>from django.db.models import Value, CharField</code> au début du fichier. Pour être honnête je ne sais pas exactement ce que c’est. J’ai pompé sur les exemple utilisant <code>annotate</code> que j’ai trouvé sur internet.</p>
<blockquote>
<p>Je ne connais pas du tout Django, mais dans d’autres contextes, UNION entre 2 flux nécessite que les 2 flux aient exactement la même structure (même nombre de champs, et même typage).</p>
</blockquote>
<p>Oui, c’est ça. Le problème vient du champ <code>author</code> qui n’existe pas pour les webmarks et les news. Du coup, j’ai essayé de leur mettre une valeur par défaut avec <code>annotate</code>. L’attribut <code>author</code> est bien ajouté (j’ai fait le test avec un <code>print</code>, mais ça ne lui convient pas pour l’union.</p>
<blockquote>
<p>Ici, en voyant le code, je pense que tu essaies d’unir ARTICLES (4 colonnes) avec WEBMARKS et NEWS (3 colonnes). </p>
</blockquote>
<p>Exactement. J’aimerai que le visiteur ai la possibilité de s’abonner à toutes les publications du site, indifféremment de leur types, avec un seul flux.</p>
<blockquote>
<p>Et en voyant le message d’erreur, on dirait que c’est plus le typage des colonnes que le nombre de colonnes qui est en cause.</p>
</blockquote>
<p>Oui, c’est ça que je ne comprends pas. Comme si <code>author</code> avait bien été ajouté.</p>
<blockquote>
<p>Et selon moi, ajouter une colonne Author avec un contenu fictif à ton dataframe WEBMARKS et idem pour le dataframe NEWS.</p>
</blockquote>
<p>C’est ce qu’est censé faire le <code>annotate</code></p>[Django] Union avec annotation, message #2478022022-12-22T14:29:36+01:00elegance/@elegancehttps://zestedesavoir.com/forums/sujet/16691/django-union-avec-annotation/?page=1#p247802<p>Je ne connais pas du tout Django, mais dans d’autres contextes, UNION entre 2 flux nécessite que les 2 flux aient exactement la même structure (même nombre de champs, et même typage).</p>
<p>Ici, en voyant le code, je pense que tu essaies d’unir ARTICLES (4 colonnes) avec WEBMARKS et NEWS (3 colonnes). </p>
<p>Et en voyant le message d’erreur, on dirait que c’est plus le typage des colonnes que le nombre de colonnes qui est en cause.</p>
<p>Quoi qu’il en soit, c’est cette piste qu’il faut creuser. Et selon moi, ajouter une colonne Author avec un contenu fictif à ton dataframe WEBMARKS et idem pour le dataframe NEWS.</p>