<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Explorando metaprogramação em Python: django-supermodels</title>
	<atom:link href="http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/feed/" rel="self" type="application/rss+xml" />
	<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/</link>
	<description>Blog sobre desenvolvimento de software e tecnologia</description>
	<lastBuildDate>Sun, 16 Oct 2011 12:18:18 -0400</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-10406</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Fri, 26 Jun 2009 03:03:09 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-10406</guid>
		<description>Quando vc está estudando vc não precisa necessariamente fazer coisas que façam sentido. No meu caso minha única exigência é que só precisa ser divertido :) Eu aprendi um bocado de metaprogramação em Python fazendo isso e experimentando possiveis soluções, além de ter olhado e conhecido um bocado do código fonte dos models do Django. Faça isso vc tb, eu recomendo :)

[ ]s, gc</description>
		<content:encoded><![CDATA[<p>Quando vc está estudando vc não precisa necessariamente fazer coisas que façam sentido. No meu caso minha única exigência é que só precisa ser divertido <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Eu aprendi um bocado de metaprogramação em Python fazendo isso e experimentando possiveis soluções, além de ter olhado e conhecido um bocado do código fonte dos models do Django. Faça isso vc tb, eu recomendo <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>[ ]s, gc</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Henrique</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-10126</link>
		<dc:creator>Henrique</dc:creator>
		<pubDate>Thu, 18 Jun 2009 22:49:12 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-10126</guid>
		<description>Qual a diferença com relação ao já existente Model.objects.filter(**kwargs)?

Model.objects.filter(x=1, y=2)
Model.objects.find_by_x_and_y(1, 2)

Ou foi só pra deixar igual o Rails? Em todo caso, acho kwargs bem mais elegante que métodos diferentes recebendo parâmetros posicionais, conserva a mesma sintaxe para qualquer filtro.</description>
		<content:encoded><![CDATA[<p>Qual a diferença com relação ao já existente Model.objects.filter(**kwargs)?</p>
<p>Model.objects.filter(x=1, y=2)<br />
Model.objects.find_by_x_and_y(1, 2)</p>
<p>Ou foi só pra deixar igual o Rails? Em todo caso, acho kwargs bem mais elegante que métodos diferentes recebendo parâmetros posicionais, conserva a mesma sintaxe para qualquer filtro.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6330</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Tue, 10 Mar 2009 17:20:35 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6330</guid>
		<description>@Gustavo Rezende, @Hugo Lopes Tavaves

Obrigado pela observação, vou consertar :)

@Gustavo

Sobre as dificuldades, você pode olhar o source para entender o problema. Tem um rascunho lá que você pode usar para testar se quiser.</description>
		<content:encoded><![CDATA[<p>@Gustavo Rezende, @Hugo Lopes Tavaves</p>
<p>Obrigado pela observação, vou consertar <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>@Gustavo</p>
<p>Sobre as dificuldades, você pode olhar o source para entender o problema. Tem um rascunho lá que você pode usar para testar se quiser.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6329</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Tue, 10 Mar 2009 17:17:47 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6329</guid>
		<description>@Raphael Lullis

Se vc olhar o source vai ver que tudo o que eu fiz é exatamente o que vc está falando :) O meu objetcs é uma subclasse do Manager do Django, exatamente isso.

E eu usei esse exemplo com o nome &quot;method_missing&quot; aqui no blog só para facilitar o paralelo, mas se você for ver no código do django-supermodels está do jeito que vc está falando aí ;)</description>
		<content:encoded><![CDATA[<p>@Raphael Lullis</p>
<p>Se vc olhar o source vai ver que tudo o que eu fiz é exatamente o que vc está falando <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  O meu objetcs é uma subclasse do Manager do Django, exatamente isso.</p>
<p>E eu usei esse exemplo com o nome &#8220;method_missing&#8221; aqui no blog só para facilitar o paralelo, mas se você for ver no código do django-supermodels está do jeito que vc está falando aí <img src='http://gc.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Guilherme Chapiewski</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6328</link>
		<dc:creator>Guilherme Chapiewski</dc:creator>
		<pubDate>Tue, 10 Mar 2009 17:15:13 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6328</guid>
		<description>@Vanderson

É verdade, vou pensar nisso :)</description>
		<content:encoded><![CDATA[<p>@Vanderson</p>
<p>É verdade, vou pensar nisso <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Hugo Lopes Tavares</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6325</link>
		<dc:creator>Hugo Lopes Tavares</dc:creator>
		<pubDate>Tue, 10 Mar 2009 16:39:42 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6325</guid>
		<description>Uma boa observação:
__getattribute__ é sempre chamado quando algum atributo ou método é invocado, mesmo se existir!
O método que é chamado se, e somente se, o atributo ou método não existir é o __getattr__.

Conserta aí ;)</description>
		<content:encoded><![CDATA[<p>Uma boa observação:<br />
__getattribute__ é sempre chamado quando algum atributo ou método é invocado, mesmo se existir!<br />
O método que é chamado se, e somente se, o atributo ou método não existir é o __getattr__.</p>
<p>Conserta aí <img src='http://gc.blog.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Gustavo Rezende</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6324</link>
		<dc:creator>Gustavo Rezende</dc:creator>
		<pubDate>Tue, 10 Mar 2009 16:29:57 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6324</guid>
		<description>Fala guilherme, acho a reescrita do método __getattr__ mais adequada, pois __getattribute__ é invocado para toda chamada de um attributo/método. Entretanto, __getattr__ só é chamado quando o attributo não existe.

Qual foi o problema de usar algo parecido com isso no Model??? :

from ... import Model as DjangoModel

class SuperModel(DjangoModel):
  def __getattr__(self, attr):
       if attr.startswith(&#039;find_by_&#039;):
            return busca no banco
       else:
            return DjangoModel,__getattr__(self,attr)</description>
		<content:encoded><![CDATA[<p>Fala guilherme, acho a reescrita do método __getattr__ mais adequada, pois __getattribute__ é invocado para toda chamada de um attributo/método. Entretanto, __getattr__ só é chamado quando o attributo não existe.</p>
<p>Qual foi o problema de usar algo parecido com isso no Model??? :</p>
<p>from &#8230; import Model as DjangoModel</p>
<p>class SuperModel(DjangoModel):<br />
  def __getattr__(self, attr):<br />
       if attr.startswith(&#8217;find_by_&#8217;):<br />
            return busca no banco<br />
       else:<br />
            return DjangoModel,__getattr__(self,attr)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Raphael Lullis</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6322</link>
		<dc:creator>Raphael Lullis</dc:creator>
		<pubDate>Tue, 10 Mar 2009 15:16:36 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6322</guid>
		<description>Oi, Guilherme,

Mais algumas dicas em relação a questão de Model e Manager: o objects é o models.Manager implementado por default em qualquer models.Model. Se você adicionar um outro models.Manager à tua classe, você vai &quot;perder&quot; o objects.

A melhor solução pro teu caso acaba sendo por definir uma classe SupermodelManager, herdando de models.Manager, que implemente o método find_by, e vai adicionar uma instância do seu SuperModelManager nas classes de Model que você quer ter os finders. &lt;i&gt;Aí&lt;/i&gt;, então você vai mexer no __getattribute__ do Model, que vai implementar o method_missing e fazer chamada para o find_by do teu SuperManager.

Outra coisa: não sei se você precisa usar o method_missing para ter os seus finders. Se você está implementando o __getattribute__, você sabe qual é o nome do método que está chamando. Ou seja, se você está implementando &lt;i&gt;__getattribute__(self, name)&lt;/i&gt;, basta fazer um if name.startswith(&quot;find_by&quot;), para descobrir se o que você quer é o acesso a um atributo ou se quer fazer uma chamada ao find_by. Usar method_missing, no caso, parece-me desnecessariamente custoso, é melhor lidar com comparação de string do que sempre ficar lidando a exceção NotImplementedError.</description>
		<content:encoded><![CDATA[<p>Oi, Guilherme,</p>
<p>Mais algumas dicas em relação a questão de Model e Manager: o objects é o models.Manager implementado por default em qualquer models.Model. Se você adicionar um outro models.Manager à tua classe, você vai &#8220;perder&#8221; o objects.</p>
<p>A melhor solução pro teu caso acaba sendo por definir uma classe SupermodelManager, herdando de models.Manager, que implemente o método find_by, e vai adicionar uma instância do seu SuperModelManager nas classes de Model que você quer ter os finders. <i>Aí</i>, então você vai mexer no __getattribute__ do Model, que vai implementar o method_missing e fazer chamada para o find_by do teu SuperManager.</p>
<p>Outra coisa: não sei se você precisa usar o method_missing para ter os seus finders. Se você está implementando o __getattribute__, você sabe qual é o nome do método que está chamando. Ou seja, se você está implementando <i>__getattribute__(self, name)</i>, basta fazer um if name.startswith(&#8221;find_by&#8221;), para descobrir se o que você quer é o acesso a um atributo ou se quer fazer uma chamada ao find_by. Usar method_missing, no caso, parece-me desnecessariamente custoso, é melhor lidar com comparação de string do que sempre ficar lidando a exceção NotImplementedError.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Daniel F. Martins</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6320</link>
		<dc:creator>Daniel F. Martins</dc:creator>
		<pubDate>Tue, 10 Mar 2009 14:00:14 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6320</guid>
		<description>Interessante o projeto!

Concordo com o Igor... isso deve ficar no manager, pois ele serve justamente para fornecer esse tipo de funcionalidade.

[]s!</description>
		<content:encoded><![CDATA[<p>Interessante o projeto!</p>
<p>Concordo com o Igor&#8230; isso deve ficar no manager, pois ele serve justamente para fornecer esse tipo de funcionalidade.</p>
<p>[]s!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vanderson</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6319</link>
		<dc:creator>Vanderson</dc:creator>
		<pubDate>Tue, 10 Mar 2009 12:40:49 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6319</guid>
		<description>Muito legal implementar uma feature do Rails no Django.

Outra coisa legal seria se o Django tivesse o has_many e belongs_to do Rails em relacionamentos 1- * ao invés de tascar uma declaração de foreignKey.</description>
		<content:encoded><![CDATA[<p>Muito legal implementar uma feature do Rails no Django.</p>
<p>Outra coisa legal seria se o Django tivesse o has_many e belongs_to do Rails em relacionamentos 1- * ao invés de tascar uma declaração de foreignKey.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Igor Sobreira</title>
		<link>http://gc.blog.br/2009/03/10/explorando-metaprogramacao-em-python-django-supermodels/comment-page-1/#comment-6316</link>
		<dc:creator>Igor Sobreira</dc:creator>
		<pubDate>Tue, 10 Mar 2009 08:14:25 +0000</pubDate>
		<guid isPermaLink="false">http://gc.blog.br/?p=832#comment-6316</guid>
		<description>Olá Guilherme, muito interessante teu artigo. Não conhecia esses métodos de busca dinâmicos do rails. Deve ser um dos motivos do pessoal chamar ele de &quot;mágico&quot; :-).

Mas em relação ao projeto supermodels, eu deixaria os &quot;find_by*&quot; no manager mesmo (objects), já que o padrão usado no Django é esse mesmo: quem faz as buscas é o Manager (que por sua vez repassa pra QuerySet). E não o Model em si.</description>
		<content:encoded><![CDATA[<p>Olá Guilherme, muito interessante teu artigo. Não conhecia esses métodos de busca dinâmicos do rails. Deve ser um dos motivos do pessoal chamar ele de &#8220;mágico&#8221; <img src='http://gc.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Mas em relação ao projeto supermodels, eu deixaria os &#8220;find_by*&#8221; no manager mesmo (objects), já que o padrão usado no Django é esse mesmo: quem faz as buscas é o Manager (que por sua vez repassa pra QuerySet). E não o Model em si.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

