2016-10-12 4 views
-1

Я хочу использовать Django для написания системы блога. Но вопрос в том, что я не могу получить теги queryset из статей queryset.Я не знаю, как с помощью одного типа запроса задать 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',) 
    ... 

просмотров:

.... 
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

Да. Это нормально? –

ответ

0

Вы используете related_name неправильно. related_name - это имя для обратных отношений. Оно должно быть:

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

Так простой ответ на ваш вопрос использования:

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

Но это не является эффективным, поскольку он выдает 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

Большое спасибо! Он был решен –