0

これらは私のDBモデルです:

class Category(models.Model):
    name = models.CharField(max_length = 20, unique = True)
    ...

class Feed(models.Model):
    title = models.CharField(max_length = 100)
    category = models.ForeignKey(Category)
    ...

class Article(models.Model):
    title = models.CharField(max_length = 100)
    read = models.BooleanField(default = False)
    feed = models.ForeignKey(Feed)
    ...

すべての記事は 1 つのフィード (ソース) に属し、各フィードはカテゴリに属します。

ここで、メタ情報を含むすべてのカテゴリを表示するビューを作成したいと考えています。たとえば、カテゴリ x に未読の記事がいくつあるかなどです。

私はこのようなことを試しましたが、何もうまくいきませんでした:

categories = Category.objects.filter(feed__article__read=False)\
                             .annotate(Count('feed__article'))

それらの情報を抽出する適切な方法は何ですか? 特に、次のような情報をさらに追加したい場合: カテゴリ内のフィードの数と 1 つのクエリセット内のお気に入りの記事の数 (可能であれば)...

何か案は?ありがとう。

編集:この問題を「解決」する方法がわからなかったので、醜い回避策を書きました:

result = categories.values_list('name', 
                                'feed__title', 
                                'feed__article__title', 
                                'feed__article__read')

for i in range(0, len(result)):

    #if pointer changed to a new category
    #dump current dict to list and clear dict for the new values
    if last != result[i][0]:
        category_list.append(category_info.copy())
        category_info.clear()
        last = result[i][0]         

    if some values None:
         insert values        
    elif some other values None:
         insert values

    else:

        category_info['name'] = result[i][0]
        category_info['feed_count'] = category_info.get('feed_count', 0) + 1
        category_info['all_article_count'] = category_info.get('all_article_count', 0) + 1
        #if a article has not been read yet
        if result[i][3] == False:
            category_info['unread_article_count'] = category_info.get('unread_article_count', 0) + 1

    #if this category is the last in the result-list
    if i+1 == len(result):
        category_list.append(category_info.copy())

    i += 1

これらの情報を取得するためのより迅速で適切な方法があると確信していますが、少なくとも当面はそれで作業できます :/

4

1 に答える 1

0

情報にラベルを付ける必要があります。category.article_count以下のクエリを使用すると、クエリセット内のアイテムに使用できるはずです。

categories = Category.objects.filter(feed__article__read=False)\
                         .annotate(article_count=Count('feed__article'))
于 2013-05-27T12:51:48.213 に答える