Добавление дополнительного поля, чтобы определить, связан ли объект с другим

Я пытаюсь создать дополнительное поле в запросе 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 %}
Другие вопросы по тегам