In [1]:
from watson import search as watson

In [2]:
%%time
search_results = watson.search("claas")

for result in search_results:
    print(result.title, result.url, result.meta)


Claas rollt herum und setzt sich alleine hin /blogs/das_claas_blog/Claas-rollt-herum-und-setzt-sich-alleine-hin/ {}
Claas erste Demo /blogs/das_claas_blog/Claas-erste-Demo/ {}
Claas zieht sich zum ersten Mal am Sofa hoch /blogs/das_claas_blog/Claas-zieht-sich-zum-ersten-Mal-am-Sofa-hoch/ {}
Claas im Kinderkaffee /blogs/das_claas_blog/Claas-im-Kinderkaffee/ {}
Claas erster Geburtstag /blogs/das_claas_blog/claas-erster-geburtstag/ {}
Claas hält sich zum ersten Mal alleine am Tisch fest /blogs/das_claas_blog/claas-alleine-tisch/ {}
Claas hat eine neue Fortbewegungsmethode entdeckt /blogs/das_claas_blog/Claas-hat-eine-neue-Fortbewegungsmethode-entdeckt/ {}
Claas mit Opa Ingo /blogs/das_claas_blog/claas-opa-ingo/ {}
Claas dreht sich /blogs/das_claas_blog/claas-dreht-sich/ {}
Claas sitzt zum ersten Mal alleine /blogs/das_claas_blog/Claas-sitzt-zum-ersten-Mal-alleine/ {}
Claas Uroma Thea /blogs/das_claas_blog/claas_uroma_thea/ {}
Wie ist Claas da bloß raufgekommen? /blogs/das_claas_blog/Wie-ist-Claas-da-bloss-raufgekommen/ {}
Besuch im Aquazoo und Nordpark /blogs/das_claas_blog/Besuch-im-Aquazoo-und-Nordpark/ {}
Picknick vor Hochofen 5 /blogs/das_claas_blog/Picknick-vor-dem-Hochofen-5/ {}
Besuch auf Schloß Dyck /blogs/das_claas_blog/Besuch-auf-Schloss-Dyck/ {}
Museumsinsel Hombroich /blogs/das_claas_blog/Museumsinsel-Hombroich/ {}
Geräusche auf dem Wickeltisch /blogs/das_claas_blog/claas-wickeltisch-geraeusche/ {}
Ein neues Abentheuer /blogs/das_claas_blog/ein-neues-abentheuer/ {}
Ballaballa /blogs/das_claas_blog/Ballaballa/ {}
Luftrollenspielzeug /blogs/das_claas_blog/Luftrollenspielzeug/ {}
Die U5 ist überstanden /blogs/das_claas_blog/u5/ {}
Spieldecke /blogs/das_claas_blog/Spieldecke/ {}
Zum ersten Mal Draussen /blogs/das_claas_blog/Zum-ersten-Mal-Draussen/ {}
Kinderwagen ist ok /blogs/das_claas_blog/kinderwagen-ok/ {}
Fuchsmütze /blogs/das_claas_blog/Fuchsmutze/ {}
Party /blogs/das_claas_blog/30_party/ {}
Lohmart /blogs/das_claas_blog/lohmart/ {}
Onkel Karl /blogs/das_claas_blog/onkel-karl/ {}
Wickeltisch /blogs/das_claas_blog/wickeltisch/ {}
Kaffeetrinken in der Spoerl-Fabrik /blogs/das_claas_blog/Kaffeetrinken-in-der-Spoerl-Fabrik/ {}
Wintergarten wieder ohne Kissen /blogs/das_claas_blog/wintergarten_ohne_kissen/ {}
Zum ersten Mal beim Krabbeln gefilmt /blogs/das_claas_blog/Zum-ersten-Mal-beim-Krabbeln-gefilmt/ {}
Alleine Einschlafen /blogs/das_claas_blog/Alleine-Einschlafen/ {}
Milchbinge /blogs/das_claas_blog/Milchbinge/ {}
Klettern /blogs/das_claas_blog/Klettern/ {}
Oh nein, die Türen /blogs/das_claas_blog/tueren/ {}
CPU times: user 16.4 ms, sys: 5.27 ms, total: 21.6 ms
Wall time: 68.9 ms

In [3]:
Post.objects.count()


Out[3]:
143

In [4]:
%%time
for post in watson.filter(Post, "claas"):
    print(post.title, post.pk)


Claas rollt herum und setzt sich alleine hin 76
Claas erste Demo 121
Claas zieht sich zum ersten Mal am Sofa hoch 74
Claas im Kinderkaffee 93
Claas erster Geburtstag 151
Claas hält sich zum ersten Mal alleine am Tisch fest 70
Claas hat eine neue Fortbewegungsmethode entdeckt 117
Claas mit Opa Ingo 47
Claas dreht sich 29
Claas sitzt zum ersten Mal alleine 72
Claas Uroma Thea 12
Wie ist Claas da bloß raufgekommen? 136
Besuch im Aquazoo und Nordpark 115
Picknick vor Hochofen 5 124
Besuch auf Schloß Dyck 119
Museumsinsel Hombroich 116
Geräusche auf dem Wickeltisch 30
Ein neues Abentheuer 140
Ballaballa 143
Luftrollenspielzeug 82
Die U5 ist überstanden 78
Spieldecke 33
Zum ersten Mal Draussen 3
Kinderwagen ist ok 36
Fuchsmütze 60
Party 22
Lohmart 34
Onkel Karl 46
Wickeltisch 35
Kaffeetrinken in der Spoerl-Fabrik 75
Wintergarten wieder ohne Kissen 85
Zum ersten Mal beim Krabbeln gefilmt 87
Alleine Einschlafen 146
Milchbinge 92
Klettern 131
Oh nein, die Türen 139
CPU times: user 4.36 ms, sys: 1.82 ms, total: 6.18 ms
Wall time: 5.81 ms

In [37]:
from django.db import models
from django.db.models.functions import TruncYear
from django.db.models.functions import TruncMonth

In [19]:
#queryset = watson.filter(Post, "claas")
queryset = Post.objects.all()
fc_queryset = (queryset.order_by()
                       .annotate(year=TruncYear("visible_date"))
                       .values("year").annotate(n=models.Count("pk"))
                       .annotate(month=TruncMonth("visible_date")))
                       #.values("month").annotate(n=models.Count("pk")))

year_counts = {}
for row in fc_queryset:
    print(row)
    #year_counts[row['year']] = year_counts.get(
    #    row['year'], 0
    #) + row['n']


{'year': datetime.datetime(2017, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 10, 'month': datetime.datetime(2017, 12, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 1, 'month': datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2017, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 18, 'month': datetime.datetime(2017, 9, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 2, 'month': datetime.datetime(2019, 3, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 10, 'month': datetime.datetime(2018, 3, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 9, 'month': datetime.datetime(2018, 7, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 12, 'month': datetime.datetime(2018, 8, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 6, 'month': datetime.datetime(2018, 2, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2017, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 15, 'month': datetime.datetime(2017, 11, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2017, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 15, 'month': datetime.datetime(2017, 10, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 10, 'month': datetime.datetime(2018, 5, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 1, 'month': datetime.datetime(2018, 10, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 1, 'month': datetime.datetime(2018, 11, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 8, 'month': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 14, 'month': datetime.datetime(2018, 4, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 9, 'month': datetime.datetime(2018, 6, 1, 0, 0, tzinfo=<UTC>)}
{'year': datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 2, 'month': datetime.datetime(2019, 4, 1, 0, 0, tzinfo=<UTC>)}

In [22]:
#queryset = watson.filter(Post, "claas")
queryset = Post.objects.all()
fc_queryset = (queryset.order_by()
                       .annotate(month=TruncMonth("visible_date"))
                       .values("month").annotate(n=models.Count("pk")))

year_month_counts = {}
for row in fc_queryset:
    print(row)
    year_month_counts[row["month"]] = row["n"]
    #year_counts[row['year']] = year_counts.get(
    #    row['year'], 0
    #) + row['n']


{'month': datetime.datetime(2018, 6, 1, 0, 0, tzinfo=<UTC>), 'n': 9}
{'month': datetime.datetime(2017, 10, 1, 0, 0, tzinfo=<UTC>), 'n': 15}
{'month': datetime.datetime(2019, 3, 1, 0, 0, tzinfo=<UTC>), 'n': 2}
{'month': datetime.datetime(2018, 11, 1, 0, 0, tzinfo=<UTC>), 'n': 1}
{'month': datetime.datetime(2018, 10, 1, 0, 0, tzinfo=<UTC>), 'n': 1}
{'month': datetime.datetime(2018, 8, 1, 0, 0, tzinfo=<UTC>), 'n': 12}
{'month': datetime.datetime(2018, 5, 1, 0, 0, tzinfo=<UTC>), 'n': 10}
{'month': datetime.datetime(2018, 7, 1, 0, 0, tzinfo=<UTC>), 'n': 9}
{'month': datetime.datetime(2017, 9, 1, 0, 0, tzinfo=<UTC>), 'n': 18}
{'month': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 8}
{'month': datetime.datetime(2019, 4, 1, 0, 0, tzinfo=<UTC>), 'n': 2}
{'month': datetime.datetime(2018, 2, 1, 0, 0, tzinfo=<UTC>), 'n': 6}
{'month': datetime.datetime(2018, 4, 1, 0, 0, tzinfo=<UTC>), 'n': 14}
{'month': datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 1}
{'month': datetime.datetime(2017, 11, 1, 0, 0, tzinfo=<UTC>), 'n': 15}
{'month': datetime.datetime(2017, 12, 1, 0, 0, tzinfo=<UTC>), 'n': 10}
{'month': datetime.datetime(2018, 3, 1, 0, 0, tzinfo=<UTC>), 'n': 10}

In [10]:
year_counts


Out[10]:
{datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>): 3,
 datetime.datetime(2017, 1, 1, 0, 0, tzinfo=<UTC>): 12,
 datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>): 21}

In [15]:
year_counts


Out[15]:
{datetime.datetime(2019, 1, 1, 0, 0, tzinfo=<UTC>): 3,
 datetime.datetime(2017, 1, 1, 0, 0, tzinfo=<UTC>): 12,
 datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>): 21}

In [25]:
for ym, count in sorted(year_month_counts.items()):
    print(ym.strftime("%Y-%m"), ":", count)


2017-09 : 18
2017-10 : 15
2017-11 : 15
2017-12 : 10
2018-01 : 8
2018-02 : 6
2018-03 : 10
2018-04 : 14
2018-05 : 10
2018-06 : 9
2018-07 : 9
2018-08 : 12
2018-10 : 1
2018-11 : 1
2019-01 : 1
2019-03 : 2
2019-04 : 2

Test actual filter


In [33]:
for blog in Blog.objects.all():
    print(blog.pk, blog.slug)


1 ephes_blog
2 das_claas_blog

In [14]:
from cast.views import PostsListView

In [13]:
from cast.filters import PostFilter
from django_filters.filterset import filterset_factory

In [23]:
class DummyRequest:
    def __init__(self, get={}):
        self.GET = get

In [27]:
pl = PostsListView()
pl.kwargs = {"slug": "das_claas_blog"}
pl.request = DummyRequest()

In [30]:
kwargs = pl.get_filterset_kwargs(PostFilter)
f = PostFilter(**kwargs)

In [31]:
f.qs


Out[31]:
<QuerySet [<Post: Wie ist Claas da bloß raufgekommen?>, <Post: Claas erster Geburtstag>, <Post: Alle zusammen in Lohmar>, <Post: Alles Ba!>, <Post: Mit Sophie und Dirk zu Besuch bei Huan und Volker>, <Post: Trockenheit>, <Post: Ein langes Brillenvideo>, <Post: Der böse Staubsauger...>, <Post: Ein neues Abentheuer>, <Post: Klettern>, <Post: Ja, es ist sehr warm>, <Post: Abend mit Heike und Chrissie>, <Post: Picknick vor Hochofen 5>, <Post: Mit Sina auf der Kirmes>, <Post: Kinderflohmarkt>, <Post: Nein, es ist noch nicht besser geworden...>, <Post: Claas erste Demo>, <Post: Im Pool>, <Post: Flashback Frühling>, <Post: Besuch auf Schloß Dyck>, '...(remaining elements truncated)...']>

In [34]:
f = PostFilter(blog=Blog.objects.get(pk=2))

In [35]:
f.qs


Out[35]:
<QuerySet [<Post: Wie ist Claas da bloß raufgekommen?>, <Post: Claas erster Geburtstag>, <Post: Alle zusammen in Lohmar>, <Post: Alles Ba!>, <Post: Mit Sophie und Dirk zu Besuch bei Huan und Volker>, <Post: Trockenheit>, <Post: Ein langes Brillenvideo>, <Post: Der böse Staubsauger...>, <Post: Ein neues Abentheuer>, <Post: Klettern>, <Post: Ja, es ist sehr warm>, <Post: Abend mit Heike und Chrissie>, <Post: Picknick vor Hochofen 5>, <Post: Mit Sina auf der Kirmes>, <Post: Kinderflohmarkt>, <Post: Nein, es ist noch nicht besser geworden...>, <Post: Claas erste Demo>, <Post: Im Pool>, <Post: Flashback Frühling>, <Post: Besuch auf Schloß Dyck>, '...(remaining elements truncated)...']>

In [38]:
queryset = f.qs
fc_queryset = (queryset.order_by()
                       .annotate(month=TruncMonth("visible_date"))
                       .values("month").annotate(n=models.Count("pk")))

year_month_counts = {}
for row in fc_queryset:
    print(row)
    year_month_counts[row["month"]] = row["n"]


{'month': datetime.datetime(2018, 6, 1, 0, 0, tzinfo=<UTC>), 'n': 9}
{'month': datetime.datetime(2018, 7, 1, 0, 0, tzinfo=<UTC>), 'n': 9}
{'month': datetime.datetime(2017, 10, 1, 0, 0, tzinfo=<UTC>), 'n': 11}
{'month': datetime.datetime(2017, 9, 1, 0, 0, tzinfo=<UTC>), 'n': 10}
{'month': datetime.datetime(2018, 1, 1, 0, 0, tzinfo=<UTC>), 'n': 8}
{'month': datetime.datetime(2018, 2, 1, 0, 0, tzinfo=<UTC>), 'n': 6}
{'month': datetime.datetime(2018, 4, 1, 0, 0, tzinfo=<UTC>), 'n': 14}
{'month': datetime.datetime(2017, 11, 1, 0, 0, tzinfo=<UTC>), 'n': 11}
{'month': datetime.datetime(2017, 12, 1, 0, 0, tzinfo=<UTC>), 'n': 10}
{'month': datetime.datetime(2018, 3, 1, 0, 0, tzinfo=<UTC>), 'n': 10}
{'month': datetime.datetime(2018, 8, 1, 0, 0, tzinfo=<UTC>), 'n': 9}
{'month': datetime.datetime(2018, 5, 1, 0, 0, tzinfo=<UTC>), 'n': 10}

In [39]:
for ym, count in sorted(year_month_counts.items()):
    print(ym.strftime("%Y-%m"), ":", count)


2017-09 : 10
2017-10 : 11
2017-11 : 11
2017-12 : 10
2018-01 : 8
2018-02 : 6
2018-03 : 10
2018-04 : 14
2018-05 : 10
2018-06 : 9
2018-07 : 9
2018-08 : 9

In [40]:
from datetime import datetime

In [41]:
year_month = datetime.strptime("2019-01", "%Y-%m")

In [42]:
year_month


Out[42]:
datetime.datetime(2019, 1, 1, 0, 0)

In [43]:
year_month.year


Out[43]:
2019

In [44]:
year_month.month


Out[44]:
1

In [45]:
blog


Out[45]:
<Blog: Claas sagt Hallo>

In [50]:
qs = (Post.objects.filter(blog=blog)
          .filter(visible_date__year=2018, visible_date__month=2))

In [51]:
qs.count()


Out[51]:
6

In [52]:
for row in qs:
    print(row)


Kaffeetrinken in der Spoerl-Fabrik
Claas zieht sich zum ersten Mal am Sofa hoch
Letzte Woche im Wildpark Grafenberger Wald
Claas rollt herum und setzt sich alleine hin
Claas sitzt zum ersten Mal alleine
Besuch bei Jo in Maastricht

In [ ]: