我正在尝试在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标记?
答案 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。根据它,结果将在前端显示不同。
干杯,