2017-04-03 3 views
2

少なくとも1つのpostが添付されているすべてのカテゴリを取得するクエリを作成しようとしています。言い換えれば、投稿を持たないカテゴリを「除外」したいのです。 、これは私が私のクエリで使用していたコードであるDjangoでは、ForeignKeyフィールドを使用して関連モデルの他のインスタンスをアタッチしたモデルのインスタンスをすべて取得するにはどうすればよいですか?

class Category(models.Model): 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(max_length=250, unique=True) 


class Post(models.Model): 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(max_length=250, unique=True) 
    body = models.TextField() 
    category = models.ForeignKey(Category, blank=True, default="") 

現在、それは何のポストがそれに「取り付けられていない」されている場合でも、すべてのカテゴリをフェッチ:

これらはCategoryPostのための私のモデルであり

categories = Category.objects.filter(
    # Only ones that have at least one Post that has it's 'category' field set to it. 
) 

categories = Category.objects.all() 

は、私が欲しいのはこのようなものです私はドキュメントや他の場所を検索しましたが、解決策を見つけることはできません。

どうすればいいのか教えてください。

+0

'Post'モデルには' Topic'モデルに対する外部キーがあり、それを 'categories'と呼んでいます。私は、この関係が「カテゴリ」モデルでどのように働いているのか分かりません。 – AKS

+0

@AKS混乱して申し訳ありません。トピックのトピックをトピックのカテゴリに置き換えて、私が達成しようとしていたことがより明確になると思った。私はそれを今修正したので、ありがとう。 –

+0

答えを確認してください。 – AKS

答えて

2

クエリ使用することができます以下

categories = Category.objects.filter(post__isnull=False).distinct() 

これはpostがnullでないすべてのカテゴリを取得します。 1つのカテゴリに複数の投稿がある可能性があるため、同じIDを持つ重複したインスタンスを取得します。重複するカテゴリを削除するにはdistinctにしてください。

distinct(*fields)はpostgresql固有のものです。別のデータベースを使用している場合は、distinct()を使用してください。

+0

このコードで次のエラーが発生しました。 NotImplementedError at/ DISTINCT ONフィールドは、このデータベースバックエンドではサポートされていません。 最後に.distince( 'id')を削除すると、エラーはなくなりましたが、前述したように重複するインスタンスが発生しています。 –

+0

私は参照してください。フィールドに 'distinct'を使用するのは純粋にpostgresql固有のもので、別のデータベースを使用しているようです。フィールドなしで 'distinct()'を使うことができます。 – AKS

+0

私はSqlLiteを使用しています。 distinct()を使用して問題を修正しました。どうもありがとう! –

0

別のカテゴリのPostを照会し、IDでカテゴリをフィルタリングすることによって、すべての一意のカテゴリIDを取得します。

id_list = Post.objects.values_list('category_id').distinct() 
catgories = Category.objects.filter(id__in=id_list) 
関連する問題