ユーザーが独自のフィードとカテゴリを追加できる RSS フィード リーダーを構築しています。すべてのフィードのコンテンツを db に保存し、定期的に db に存在するすべての feed_url のコンテンツを取得するスクリプトを実行したい (各フィードがライブで取得される作業プロジェクトがあり、それは良い考えではありませんでした)
何度か試みた後、次のモデル構造になりました。
class Category(models.Model):
name = models.CharField(unique=False, max_length=64)
user = models.ForeignKey(User)
def __unicode__(self):
return self.name
class Meta:
ordering = ('name',)
class Feed(models.Model):
feed_url = models.URLField(unique=True)
def __unicode__(self):
return self.feed_url
class UserFeed(models.Model):
feed = models.ForeignKey(Feed)
title = models.CharField(max_length=256)
category = models.ForeignKey(Category)
user = models.ForeignKey(User)
def __unicode__(self):
return self.title
class Post(models.Model):
feed = models.ForeignKey(Feed, related_name='feed_posts')
## starting from here, my cronjob / script populates the data (using feedparser lib)
title = models.CharField(max_length=256)
content = models.TextField()
link = models.URLField(max_length=512)
dt_published = models.DateTimeField()
dt_cached = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return '%s (%s)' % (self.feed, self.title)
class Meta:
ordering = ('-dt_published',)
私が今探しているのは、次のエンティティであるビューにプルし、後でテンプレートにプルする機能です。
->カテゴリ -> フィード -> 投稿
Feed フィールドと UserFeed フィールドが 1 つのテーブル/モデルに格納されていた以前のバージョンでは、次のようなビューがありました。
def category(request, category_id):
user = request.user
page_title = "Category: "
category = get_object_or_404(Category.objects.filter(id=category_id, user=user)).feed_set.all()
category_name = Category.objects.get(id=category_id)
context = {
'page_title': page_title,
'category': category,
'category_name': category_name,
}
return expand_context_and_render(request, context, 'reader/category.html')
これは私のテンプレートです:
{% for feed in category %}
<p><a href="/reader/feed/{{ feed.id }} ">{{ feed.title }}</a></p>
{% for post in feed.post_set.all|slice:"6" %}
<p><a href="{{ post.link }}">{{ post.title }}</a></p>
<p>{{ post.content }}</p>
<p>{{ post.dt_published|timesince }} ago.</p>
{% endfor %}
{% endfor %}
そして、それは意図したとおりに機能していました。
現在、データベースに feed_url の複数のコピーを持ちたくないので、新しいモデルは問題ないと思いますが、上流と下流の関係を持つこの新しい構造を照会して表示する方法がわかりません。select_related を見ていましたが、うまくいきませんでした。助けていただけますか?