2016-09-06 3 views
4

ich ein User-Modell habe, kann jeder Benutzer viel Post von diesem relateion haben:Django mit Anmerkungen versehen auf Prefetch gefiltert verwandtes Modell

class Post(models.Model): 
    ... 
    user = models.ForeignKey('User', related_name='posts') 

, und jeder Pfosten eine like_count (Integer-Feld), ich mag Benutzer erhalten (entlang ihrer Beiträge), die mehr als n Stellen hat, die mehr als m mal gemocht, ich tue:

User.objects.prefetch_related(Prefetch('posts', queryset=Post.objects.filter(like_count__gte=m), to_attr='top_posts')).annotate(top_post_count=Count('top_posts')).filter(top_post_count__gte=n) 

aber, bekomme ich:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py", line 912, in annotate 
    clone.query.add_annotation(annotation, alias, is_summary=False) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 971, in add_annotation 
    summarize=is_summary) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/aggregates.py", line 19, in resolve_expression 
    c = super(Aggregate, self).resolve_expression(query, allow_joins, reuse, summarize) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/expressions.py", line 513, in resolve_expression 
    c.source_expressions[pos] = arg.resolve_expression(query, allow_joins, reuse, summarize, for_save) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/expressions.py", line 463, in resolve_expression 
    return query.resolve_ref(self.name, allow_joins, reuse, summarize) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 1462, in resolve_ref 
    self.get_initial_alias(), reuse) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 1402, in setup_joins 
    names, opts, allow_many, fail_on_missing=True) 
    File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 1327, in names_to_path 
    "Choices are: %s" % (name, ", ".join(available))) 
django.core.exceptions.FieldError: Cannot resolve keyword 'top_posts' into field. Choices are: ... 
+0

Post vollständige Rückverfolgung des Fehlers und Ihre models.py – kt14

+0

@ kt14 Beitrag aktualisiert – Mohsen

+0

Diese Annotation-Methode funktioniert in Django 2.0. Du hast mein Leben gerettet. Ich bin ewig dankbar. –

Antwort

1

Die docs erläutert, dass sie einem Attribut zugewiesen ist, das entsprechend dem to_attr-Parameter für die QuerySet-Elemente benannt ist.

Ich glaube nicht, dass dies impliziert, dass es als Modellfeld zugänglich ist, an das eine nachfolgende Annotation angekettet werden kann.

Sie müssen es wahrscheinlich in zwei Schritte trennen.

Bearbeiten: Die Frage hat kommentiert, dass Filter angekettet werden können, aber Anmerkungen können nicht.

+0

Filter funktionieren, Aggregationen nicht! – Mohsen

+0

Gut zu wissen. Ich werde die Antwort entsprechend aktualisieren. –

+1

Ich bekomme in Django 2.0 verkettete Annotationen. FYI. –

Verwandte Themen