添加额外字段以查找对象是否与另一个对象相关

时间:2014-01-24 19:45:08

标签: jquery python django annotate

我正在尝试在Django查询中构建一个额外字段,以指定文章是否属于Journal。

我正在尝试做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标记?

2 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分: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或0。根据它,结果将在前端显示不同。

干杯,