テーブルを JOIN した結果をオブジェクトのリストとして取得したい

1,430 views
Skip to first unread message

Hajime Nakagami

unread,
Sep 27, 2006, 11:52:15 PM9/27/06
to djan...@googlegroups.com
中神と申します。
この ML では初のポストだと思います。よろしくお願いします。質問です。

ここ↓で、RSS のエントリを収集するサンプルを作ってみたのですが、
http://blog.so-net.ne.jp/nakagami/2006-09-22
で、このサンプルを例に・・・

planet/models.py はこんなになってます(メソッドは省略)
-----------------------------------------------------------------------
class Feed(models.Model):
rss_url = models.CharField(maxlength=1024)
title = models.CharField(maxlength=200, blank=True)
link = models.CharField(maxlength=1024, blank=True)
subtitle = models.CharField(maxlength=2048, blank=True)
author = models.CharField(maxlength=200, blank=True)
class Entry(models.Model):
link = models.CharField(maxlength=1024)
title = models.CharField(maxlength=200)
description = models.TextField()
author = models.CharField(maxlength=200, blank=True)
update_date = models.DateField()
update_time = models.TimeField(null=True)
feed = models.ForeignKey(Feed)
-----------------------------------------------------------------------

planet/views.py の中で
entry_list = Entry.objects.filter(検索条件).order_by(並び順)
として、Entry オブジェクトのリストを取得して、template に渡してます。
そんでもって、template の中で、feed_id から Feed.link と Feed.title を
(Entry オブジェクトのメソッド経由で)取得してます。

で、できることなら Entry (planet_entry テーブル)と Feed(planet_feed テーブル)
をJOIN した結果をオブジェクトのリストとして取ってきたいのですが、SQL文で書くと
-----------------------------------------------------------------------
SELECT e.*, f.link rss_link, f.title rss_title FROM planet_entry e
LEFT JOIN planet_feed f ON e.feed_id=f.id
WHERE 検索条件
-----------------------------------------------------------------------
って感じになるように、モデルの API で操作できないもんなんでしょうか?

tsuyuki makoto

unread,
Sep 28, 2006, 1:44:36 AM9/28/06
to djan...@googlegroups.com
露木です。

EntryからFeedに外部キーが張られていますので、
Entry.objects.select_related().filter(検索条件).order_by(並び順)
とかすると、Feedに関しても同時にJoinして取得してくれるはずです。
その後の操作は、別々にとってくる場合と変わりありません。
http://ymasuda.jp/python/django/docs/db-api.html#select-related

planetっぽいものは、本家とdjango-jaにもあります。
本家はselect_relatedしてますが、django-jaはしてないなぁ :)
http://code.djangoproject.com/browser/djangoproject.com/django_website/urls.py
http://code.djangoproject.jp/file/root/django-ja/trunk/djangoproject.jp/djangojapan/feeds.py

06/09/28 に Hajime Nakagami<naka...@gmail.com> さんは書きました:

Hajime Nakagami

unread,
Sep 28, 2006, 2:56:22 AM9/28/06
to djan...@googlegroups.com
中神です。


うーむ、select_related(). をつけると、リレーションを張ってるところは
*自動的*に*全部*とってきちゃうんですねぇ。
#なんかものすごいなぁ
表を結合して一挙にデータを取得したほうがよいとは限らないですが、
いつか使うはずなので、思いついたところで聞いてみました。
ありがとうございます。多分、理解できたと思います。

あとでやってみます


06/09/28 に tsuyuki makoto<mtsu...@gmail.com> さんは書きました:

Reply all
Reply to author
Forward
0 new messages