Трясогузка: получение списка фрагментов с подсчетом родственных родителей - PullRequest
0 голосов
/ 20 ноября 2018

Использование Трясогузка У меня есть ArticlePage s, каждый из которых может иметь 0 или более Author s, которые являются фрагментами.

Я хотел бы получить списокAuthor s с количеством ArticlePage s, к которым они присоединены, но не могу понять, как.Я смущен ModelCluster Я думаю, что я буду в порядке с ванильным Джанго.

(Я даже не уверен, что я слишком усложняю это;не нужно, чтобы авторы заказывали статьи ...)

from django.db import models
from modelcluster.fields import ParentalKey
from wagtail.admin.edit_handlers import InlinePanel
from wagtail.core.models import Orderable, Page
from wagtail.snippets.edit_handlers import SnippetChooserPanel
from wagtail.snippets.models import register_snippet

class ArticlePage(Page):
    content_panels = Page.content_panels + [
        InlinePanel('authors', label='Authors'),
    ]

@register_snippet
class Author(models.Model):
    name = models.CharField(max_length=255, blank=False)

    panels = [
        FieldPanel('name'),
    ]

class ArticleAuthorRelationship(Orderable, models.Model):
    author = models.ForeignKey(
                'Author',
                on_delete=models.CASCADE,
                related_name='+')

    page = ParentalKey(
                'ArticlePage',
                on_delete=models.CASCADE,
                related_name='authors')

    panels = [
        SnippetChooserPanel('author'),
    ]

FWIW, я знаю, что могу получить одну статью Author, используя article.get_usage(), что удобно!

1 Ответ

0 голосов
/ 21 ноября 2018

Возвращаясь к этому через день, я думаю единственная проблема заключается в установке related_name для ArticleAuthorRelationship author свойства равным '+' (что означает, что нетобратное отношение от Author к этой модели).

Если я вместо этого сделаю:

class ArticleAuthorRelationship(Orderable, models.Model):
    author = models.ForeignKey(
                'Author',
                on_delete=models.CASCADE,
                related_name='articles')  # Changed this to 'articles'
    # etc.

Тогда я могу сделать это довольно легко:

from django.db.models import Count
from my app.models import Author

authors = Author.objects.annotate(num_articles=Count('articles')).order_by('-num_articles')

Тогда у каждого элемента в authors QuerySet есть свойство num_articles.

Я обычно устанавливаю related_name, но это кажется менее распространенным в документах Wagtail, и я почти не заметилздесь я скопировал это поведение, поэтому меня это бросило.

Если кто-то читает это и может привести примеры того, почему / когда вы хотите установить related_name на '+', мне было бы интересно узнать.Спасибо.

...