Slide 1

Slide 1 text

Django as your data management framework Roman Imankulov Python Porto #11 in Blip | 30 Jan 2019

Slide 2

Slide 2 text

Motivation

Slide 3

Slide 3 text

What is Django

Slide 4

Slide 4 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC)

Slide 5

Slide 5 text

Example github.com/imankulov/django-data-management-example

Slide 6

Slide 6 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC)

Slide 7

Slide 7 text

project manage.py settings.py app app app urls.py

Slide 8

Slide 8 text

project manage.py settings.py app app app urls.py admin.py models.py views.py templates …

Slide 9

Slide 9 text

$ pip install Django $ django-admin startproject explore

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC)

Slide 12

Slide 12 text

CREATE TABLE groups ( id BIGINT PRIMARY KEY AUTOINCREMENT, name TEXT, urlname TEXT, description TEXT, created DATETIME, … ); > communities/models.py class Group(models.Model): name = models.CharField(…) urlname = models.CharField(…) description = models.TextField() created = models.DateTimeField() … class Meta: db_table = ‘groups’

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

$ ./manage.py makemigrations

Slide 15

Slide 15 text

$ ./manage.py makemigrations $ ./manage.py migrate

Slide 16

Slide 16 text

$ ./manage.py makemigrations $ ./manage.py migrate $ ./manage.py inspectdb

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Get a single object sql> SELECT * FROM groups WHERE id = 42

Slide 19

Slide 19 text

Get a single object sql> SELECT * FROM groups WHERE id = 42 >>> Group.objects.get(id=42)

Slide 20

Slide 20 text

Get a queryset sql> SELECT * FROM groups ... WHERE members > 400 ... AND created >= ‘2018-01-01’ ... ORDER BY members DESC ... LIMIT 10;

Slide 21

Slide 21 text

Get a queryset sql> SELECT * FROM groups ... WHERE members > 400 ... AND created >= ‘2018-01-01’ ... ORDER BY members DESC ... LIMIT 10; >>> Group.objects.filter( members__gt=400, created__gt=datetime(2018, 1, 1) ).order_by(‘-members')[:10]
 , …]>

Slide 22

Slide 22 text

Convert to DataFrame queryset = Group.objects.filter(…) df = pd.DataFrame.from_records(groups.values())

Slide 23

Slide 23 text

Convert to DataFrame queryset = Group.objects.filter(…) df = pd.DataFrame.from_records(groups.values()) city country ... urlname who 0 Lisbon PT ... ironhack-lisbon Ironhackers 1 Lisbon PT ... AI-Lisbon Members 2 Lisbon PT ... Lisbon-Artificial-Intelligence-Meetup Members 3 Lisbon PT ... Lisbon-Virtual-Currency-Meetup Members 4 Lisbon PT ... Zalando-Tech-Events-Lisbon Members 5 Lisbon PT ... Lisbon-Kaggle Kagglers 6 Lisbon PT ... Sketch-Design-Lisbon Members [7 rows x 13 columns]

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC)

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

> communities/admin.py @admin.register(Group) class GroupAdmin(admin.ModelAdmin): list_display = ['name', ‘city’, ...] list_filter = ['country', 'city'] search_fields = ['name', 'organizer_name']

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC)

Slide 32

Slide 32 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC) Model-template-view framework (MTV)

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

> urls.py urlpatterns = [ path('simple/', views.simple_dashboard), path('input/', views.input_dashboard), … ] GET /input/?limit=20&order_by=… > views.py def simple_dashboard(request): …

Slide 36

Slide 36 text

> views.py def simple_dashboard(request): … return HttpResponse(…)

Slide 37

Slide 37 text

> views.py @staff_member_required def simple_dashboard(request): … return HttpResponse(…)

Slide 38

Slide 38 text

> views.py @staff_member_required def simple_dashboard(request): … return HttpResponse(…)

Slide 39

Slide 39 text

> views.py def input_dashboard(request): form = InputForm(…) … df = pd.DataFrame.from_values(…) return render( request, ‘dashboard.html’, {…})

Slide 40

Slide 40 text

> views.py def input_dashboard(request): form = InputForm(…) … df = pd.DataFrame.from_values(…) return render( request, ‘dashboard.html’, {…}) > templates/dashboard.html {{ form.as_table }} {{ df.to_html|safe }}

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

What can Django give to me? • Project structure • Object-relational mapping (ORM) • Admin panel • Model-view-controller framework (MVC)

Slide 43

Slide 43 text

Django hints for data people

Slide 44

Slide 44 text

Django hints for data people • Can I use Django from Jupyter Notebook? • You can, but you need to initialize your environment properly to make it explicit which project we are working with right now

Slide 45

Slide 45 text

Django hints for data people • Can I use Django from Jupyter Notebook? • You can, but you need to initialize your environment properly to make it explicit which project we are working with right now

Slide 46

Slide 46 text

Django hints for data people • What is the easiest way to display a plot in my Django view? • Use Pygal (https://pygal.org) which draws plots to SVG and put them right in your templates

Slide 47

Slide 47 text

Django hints for data people • What is the easiest way to display a plot in my Django view? • Use Pygal (https://pygal.org) which draws plots to SVG and put them right in your templates > views.py @staff_member_required def plot_dashboard(request): groups = Group.objects.order_by('-members')[:10] df = pd.DataFrame.from_records(groups.values()) bar = pygal.Bar(…) bar.x_labels = df.name bar.add('Members', df.members) return render(request, 'plot_dashboard.html', { 'df': df, 'bar': bar.render(is_unicode=True), })

Slide 48

Slide 48 text

Django hints for data people • What is the easiest way to display a plot in my Django view? • Use Pygal (https://pygal.org) which draws plots to SVG and put them right in your templates > views.py @staff_member_required def plot_dashboard(request): groups = Group.objects.order_by('-members')[:10] df = pd.DataFrame.from_records(groups.values()) bar = pygal.Bar(…) bar.x_labels = df.name bar.add('Members', df.members) return render(request, 'plot_dashboard.html', { 'df': df, 'bar': bar.render(is_unicode=True), }) > templates/plot_dashboard.html {{ bar|safe }} {{ df.to_html|safe }}

Slide 49

Slide 49 text

Django hints for data people • What is the easiest way to display a plot in my Django view? • Use Pygal (https://pygal.org) which draws plots to SVG and put them right in your templates > views.py @staff_member_required def plot_dashboard(request): groups = Group.objects.order_by('-members')[:10] df = pd.DataFrame.from_records(groups.values()) bar = pygal.Bar(…) bar.x_labels = df.name bar.add('Members', df.members) return render(request, 'plot_dashboard.html', { 'df': df, 'bar': bar.render(is_unicode=True), }) > templates/plot_dashboard.html {{ bar|safe }} {{ df.to_html|safe }}

Slide 50

Slide 50 text

Django hints for data people • Can I serve my Jupyter Notebooks with Django • It’s not straightforward, but you can convert them to HTML with nbconvert and serve this way

Slide 51

Slide 51 text

Django hints for data people • Can I serve my Jupyter Notebooks with Django • It’s not straightforward, but you can convert them to HTML with nbconvert and serve this way > views.py class StringWriter(WriterBase): content = None def write(self, output, resources, **kw): self.content = output @staff_member_required def notebook(request): exporter = HTMLExporter( exclude_input=True, exclude_output_prompt=True) writer = StringWriter() app = NbConvertApp(writer=writer, exporter=exporter) app.convert_single_notebook(‘filename.ipynb’) return HttpResponse(writer.content)

Slide 52

Slide 52 text

Django hints for data people • Can I serve my Jupyter Notebooks with Django • It’s not straightforward, but you can convert them to HTML with nbconvert and serve this way > views.py class StringWriter(WriterBase): content = None def write(self, output, resources, **kw): self.content = output @staff_member_required def notebook(request): exporter = HTMLExporter( exclude_input=True, exclude_output_prompt=True) writer = StringWriter() app = NbConvertApp(writer=writer, exporter=exporter) app.convert_single_notebook(‘filename.ipynb’) return HttpResponse(writer.content)

Slide 53

Slide 53 text

Django hints for data people • How can I initiate long-running tasks from Django views? • Offload these tasks to workers. For example, use Celery 
 (http://celeryproject.org/)

Slide 54

Slide 54 text

Questions?