2017-06-22 79 views
1

嗨,我想知道是否有人可以帮助我解决这个问题,因为我是django的新手。django ORM:查询三个模型

我有以下型号

class Article(models.Model): 
    articleid = models.CharField(primary_key=True,max_length=20) 
    author = models.CharField(max_length=300) 
    title = models.CharField(max_length=500) 

# Each article can only have one ArticleTone 
class ArticleTone(models.Model): 
    label = (
    ('sad', 'Sad'), 
    ('happy', 'Happy'),) 
    articleid = models.ForeignKey(Article, on_delete=models.CASCADE, db_column="article") 
    tone = CharField(max_length=10,choices=label,blank=False, null=False) 

    class Meta: 
     ordering = ('tone',) 
# Each article will have 5 keywords 
class ArticleKeywords(models.Model): 
    articleid = models.ForeignKey(Article, on_delete=models.CASCADE, db_column="article") 
    keywords = models.CharField(max_length=100,blank=False, null=False) 

我能够获得使用此查询的前20名的实体。

ArticleKeywords.objects.values('articleid').annotate(result=Count('keywords')).order_by('-result')[:20] 

,并能够得到将是悲伤或快乐的方法是使用下面

ArticleTone.objects.filter(name= 'sad'); 

但我怎么把碎片拼凑起来,让所有包含前20悲或喜的文章篇文章。任何帮助表示赞赏

回答

0

您可以使用Q objects

from django.db.models import Q 
q = Q(name='sad') | Q(name='happy') 
ArticleTone.objects.filter(q).values('articleid').annotate(result=Count('keywords')).order_by('-result')[:20] 
+0

我想这一点,但实际上并没有给我的前20悲或喜的文章(基于他们的文章中出现。无论哪种方式,感谢您的帮助。去捅了一下周围更得到它 – tom1123