2014-01-24 18 views
1

我试图在Django查询中构建一个额外的字段来指定文章是否属于日记。添加额外的字段,以查找对象是否与另一个相关

我试图做类似Article.objects.filter(title__icontains='foo').extra(select={in_the_journal:Function_Belongs_To_Journal(journal_id)})

我目前迭代搜索结果中发现了这一点,但我宁愿想从数据库中检索这些信息已经

models.py如下:

class Article(models.Model): 
    title    = models.CharField(max_length=400) 
    content    = models.TextField() 
    date    = models.DateTimeField('date published', null=True, default = timezone.now()) 


class Journal(models.Model): 
    name   = models.CharField(max_length=200) 
    authors  = models.ManyToManyField(Author, null=True, blank = True) 
    articles  = models.ManyToManyField(Article, null=True, blank = True) 

那是一个方法来添加一个额外的字段来指示?或者使用多余的注释 Django标签?

回答

0

我发现避免迭代列表的绝佳解决方案。这样,数据库会用额外的列检索结果。

性能是现在好多了,检查出来:

journal_id = 10 
query = 'SELECT COUNT(*) FROM data_journal_articles as data WHERE data.journal_id = %s AND data.article_id = data_article.id' % journal_id 
articles = Article.objects.filter(
    date__gte = request_data['start_date'], 
    date__lte = request_data['end_date'], 
    ).extra(select={'is_checked': query}) 

额外的字段是一个给定的日记和给定的作家之间的关系的一个柜台。这个结果可能是一个或零。根据它,结果将在前端显示不同。

干杯,

1

只需使用reverse relationship

Article.objects.filter(title__icontains='foo', journal__pk=journal_id) 

更新评论:如果你需要的所有文章,你想知道哪些人有期刊与否,使用RelatedManger

articles = Article.objects.filter(title__icontains='foo') 
for a in articles: 
    journals = a.journal_set.all() 
    if journals: 
     # article have journals 
     # list of Journal objects is in journals 
    else: 
     # article have not journals 

当然你可以将此循环放入模板中:

{% for a in articles %} 
    {% if a.journal_set.all %} 
     color1 
    {% else %} 
     color2 
    {% endif %} 
{% endfor %} 
+0

但我不想只有相关的对象。我想要检索两个,相关和不相关,但用一个标志来指定。该标志将用于以不同颜色显示结果。 – marcelosalloum

+0

我们需要一些关于你打算如何使用它的更多信息。由于一篇文章可能属于许多期刊,您是否打算为每一篇文章都着色?你打算展示所有的颜色吗?如果是这样,你可以给每个'Journal'分配一个'display_color',然后遍历每个'article.journal_set'并得到'journal.display_color'。 –

相关问题