{"id":1289,"date":"2011-02-12T20:14:04","date_gmt":"2011-02-12T18:14:04","guid":{"rendered":"http:\/\/j-mad.com\/blog\/?p=1289"},"modified":"2011-05-05T17:45:23","modified_gmt":"2011-05-05T15:45:23","slug":"m2m-tout-petite-astuce","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2011\/02\/12\/m2m-tout-petite-astuce\/","title":{"rendered":"M2m, tout petite astuce"},"content":{"rendered":"<p>Il faut parfois utiliser des m2m. Dans django, il y a deux moyens de les utiliser. Soit d&#8217;une fa\u00e7on simple, en d\u00e9clarant juste un ManyToManyField soit en passant par une table explicite gr\u00e2ce \u00e0 l&#8217;argument through.<\/p>\n<p>L&#8217;argument through permet d&#8217;avoir une table explicitement d\u00e9clar\u00e9 que l&#8217;on peut donc manipuler avec l&#8217;ORM.<\/p>\n<p>Mais si on utilise la m\u00e9thode commune, celle o\u00f9 c&#8217;est django qui fait tout, on pourrait avoir l&#8217;impression que l&#8217;on a alors, plus acc\u00e8s \u00e0 cette table de jointure. Ce n&#8217;est pas utile allez vous me dire, on s&#8217;en fout, la seule info que l&#8217;on manque c&#8217;est la pk des tuples.<\/p>\n<p>C&#8217;est vrai dans la plupart des cas. Mais comment faire si vous veniez \u00e0 avoir besoin de pouvoir mettre la main sur ces PK\u00a0? Si par exemple vous voulez synchroniser des choses\u00a0??<\/p>\n<p>Et bien, les choses sont bien faites en django. Il existe en effet une donn\u00e9es membres through qui permet de r\u00e9cup\u00e9rer la table cr\u00e9er automatiquement dans django.<\/p>\n<p>Un petit exemple (en reprenant celui de django)<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"kw1\">class<\/span> Topping<span class=\"br0\">&#40;<\/span>models.<span class=\"me1\">Model<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n<span class=\"co1\"># ...<\/span><br \/>\n<span class=\"kw1\">class<\/span> Pizza<span class=\"br0\">&#40;<\/span>models.<span class=\"me1\">Model<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n<span class=\"co1\"># ...<\/span><br \/>\n&nbsp; &nbsp; toppings <span class=\"sy0\">=<\/span> models.<span class=\"me1\">ManyToManyField<\/span><span class=\"br0\">&#40;<\/span>Topping<span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p>pour avoir acc\u00e9s \u00e0 la table qui relie les Pizza au Topping il suffit de faire\u00a0:<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\">Pizza.<span class=\"me1\">toppings<\/span>.<span class=\"me1\">through<\/span><\/div><\/div>\n<\/p>\n<p>et donc pour filter il suffit de faire\u00a0:<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\">Pizza.<span class=\"me1\">toppings<\/span>.<span class=\"me1\">through<\/span>.<span class=\"me1\">objects<\/span>.<span class=\"kw2\">filter<\/span> <span class=\"br0\">&#40;<\/span>\u2026. <span class=\"br0\">&#41;<\/span><\/div><\/div>\n<\/p>\n<p>Et voil\u00e0.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il faut parfois utiliser des m2m. Dans django, il y a deux moyens de les utiliser. Soit d&#8217;une fa\u00e7on simple, en d\u00e9clarant juste un ManyToManyField soit en passant par une table explicite gr\u00e2ce \u00e0 l&#8217;argument through. L&#8217;argument through permet d&#8217;avoir une table explicitement d\u00e9clar\u00e9 que l&#8217;on peut donc manipuler avec l&#8217;ORM. Mais si on utilise &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2011\/02\/12\/m2m-tout-petite-astuce\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">M2m, tout petite astuce<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[99,98],"class_list":["post-1289","post","type-post","status-publish","format-standard","hentry","category-django","tag-django","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-kN","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/1289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=1289"}],"version-history":[{"count":6,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/1289\/revisions"}],"predecessor-version":[{"id":1430,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/1289\/revisions\/1430"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=1289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=1289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=1289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}