2016-10-12 6 views
-1

私はブログシステムを書くためにDjangoを使用したいと思います。しかし、質問クエリーセットからタグクエリーセットを得ることはできません。私は1つのクエリーセットの種類をmanytomanyの関係にする方法がわかりません

モデル:

class Article(models.Model): 
    ... 
    tags = models.ManyToManyField(Tags,related_name='tags') 
    author = models.ForeignKey(
     User,on_delete=models.CASCADE,to_field="username", 
    ) 
    ... 

class Tags(models.Model): 
    tag_name = models.CharField(max_length=20) 
    def __str__(self): 
     return self.tag_name 
class Profile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE,to_field='username',) 
    ... 

ビュー:あなたは間違っrelated_nameを使用している

.... 
def get_context_data(self,**kwargs): 
    user=self.request.user 
    object_list=Article.objects.all().filter(author=self.request.user.username).order_by(F('created').desc())[:100] 
    kwargs['tags']=??? # I want to get a tags queryset related to object_list 
    return super(UserIndexView,self).get_context_data(**kwargs) 
+0

'object_list'のすべての記事のすべてのタグを取得しますか? –

+0

うん。それはOKですか? –

答えて

0

related_nameは、その逆の関係の名前です。それは次のようになります。

tags = models.ManyToManyField(Tags,related_name='articles') 

だからあなたの質問への簡単な答えは使用です:

[article.tags.all() for article in object_list] 

しかし、それはDBに100個の別のクエリを発行するので、これは効率的ではありません。これを行うには 良い方法は、次のようになります。

Tags.objects.filter(articles__author=self.request.user.username) 

related_nameプロパティの使用に注意してください)

しかし、私は唯一の100件の最新記事に関連するタグを取得するための興味深い部分を省略しましたユーザー。これを行うために、私は最善の方法は、最初の100回目の記事の日付を取得し、それに応じてフィルタリングすることであると思う:

ordered_articles = Article.objects.filter(author=self.request.user.username).order_by(F('created').desc() 
try: 
    date_limit = ordered_articles[100].created 
    return Tags.objects.filter(articles__author=self.request.user.username, articles__created__lt=date_limit) 
except IndexError: 
    return Tags.objects.filter(articles__author=self.request.user.username) 

(テストしていない回答、申し訳ありません)

また、あなたのモデルを呼び出すTag代わりにTagsである。

+0

ありがとうございました!それは解決されている –

関連する問題