Добавление дополнительного поля, чтобы определить, связан ли объект с другим
Я пытаюсь создать дополнительное поле в запросе 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?
2 ответа
Я нашел отличное решение, чтобы избежать перебора списка. Таким образом, база данных получает результат с дополнительным столбцом.
Производительность теперь намного лучше, проверьте это:
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})
Дополнительное поле является счетчиком отношений между данным журналом и данным автором. Этот результат может быть либо один, либо ноль. В зависимости от этого, результат будет отображаться по-разному во внешнем интерфейсе.
Ура,
Просто используйте обратную связь:
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 %}