45
Lo nuevo de Django Pedro Burón

Lo nuevo de Django 1.7 y 1.8

Embed Size (px)

Citation preview

Page 1: Lo nuevo de Django 1.7 y 1.8

Lo nuevo de Django

Pedro Burón

Page 2: Lo nuevo de Django 1.7 y 1.8
Page 3: Lo nuevo de Django 1.7 y 1.8
Page 4: Lo nuevo de Django 1.7 y 1.8

Django Unchained

Pedro Burón

Page 5: Lo nuevo de Django 1.7 y 1.8

Agenda

• Django 1.7

– App loading framework

– Forms

– Querysets

– Schema Migrations

Page 6: Lo nuevo de Django 1.7 y 1.8

Agenda

• Django 1.8

– Postgres specifics

– Conditional expressions

– Template Engines

Page 7: Lo nuevo de Django 1.7 y 1.8

Agenda

• Django 1.7

– Schema Migrations

• Django 1.8

– Conditional expressions

– Template Engines

Page 8: Lo nuevo de Django 1.7 y 1.8

App Loading

Framework

Page 9: Lo nuevo de Django 1.7 y 1.8

AppConfig

from django.apps import AppConfig

class RockNRollConfig(AppConfig):

name = 'rock_n_roll'

verbose_name = "Rock ’n’ roll”

class GypsyJazzConfig(RockNRollConfig):

verbose_name = "Gypsy jazz“

INSTALLED_APPS = [

'anthology.apps.GypsyJazzConfig',

# ...

]

Page 10: Lo nuevo de Django 1.7 y 1.8

Forms

Page 11: Lo nuevo de Django 1.7 y 1.8

Forms add error

def clean(self):

cleaned_data = super(ContactForm, self).clean()

cc_myself = cleaned_data.get("cc_myself")

subject = cleaned_data.get("subject")

if cc_myself and subject and "help" not in subject:

msg = u"Must put 'help' in subject."

self.add_error('cc_myself', msg)

self.add_error('subject', msg)

Page 12: Lo nuevo de Django 1.7 y 1.8

Querysets

Page 13: Lo nuevo de Django 1.7 y 1.8

Queryset as managers

class MyQueryset(models.QuerySet):

def published(self):

return self.filter(published=True)

class MyModel(models.Model):

objects = MyQueryset.as_manager()

...

Page 14: Lo nuevo de Django 1.7 y 1.8

Schema Migrations

Page 15: Lo nuevo de Django 1.7 y 1.8
Page 16: Lo nuevo de Django 1.7 y 1.8

Thanks to:

Andrew Godwin

Page 17: Lo nuevo de Django 1.7 y 1.8

Migrations directory

$ ./manage.py startapp myapp$ tree

.

|-- djangounchained

| |-- settings.py

| |-- urls.py

| `-- wsgi.py

|-- manage.py

`-- myapp

|-- admin.py

|-- migrations|-- models.py

`-- views.py

Page 18: Lo nuevo de Django 1.7 y 1.8

Models

# models.py

class Entry(models.Model):

title = models.CharField(…)

content = models.TextField()

slug = models.SlugField(…)

Page 19: Lo nuevo de Django 1.7 y 1.8

Make migrations

$ ./manage.py makemigrations myapp

Page 20: Lo nuevo de Django 1.7 y 1.8

The Migration File

class Migration(migrations.Migration):

dependencies = []

operations = [

migrations.CreateModel(

name='Entry',

fields=[

('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),

('title', models.CharField(max_length=200)),

('content', models.TextField()),

('slug', models.SlugField(unique=True, max_length=200)),

],

options={

},

bases=(models.Model,),

),

]

Page 21: Lo nuevo de Django 1.7 y 1.8

Migrate

$ ./manage.py migrate myapp

Page 22: Lo nuevo de Django 1.7 y 1.8

The Operations

• CreateModel

• DeleteModel

• AddField

• AlterField

• AlterModelTable

• RunSQL

• RunPython

Page 23: Lo nuevo de Django 1.7 y 1.8

CreateModel

migrations.CreateModel(

name='Person',

fields=[

('id', models.AutoField(verbose_name='ID',

serialize=False, auto_created=True,

primary_key=True)),

('full_name’,models.CharField(max_length=100)),

],

options={},

bases=(models.Model,),

)

Page 24: Lo nuevo de Django 1.7 y 1.8

AddField

dependencies = [

('people', '0001_initial'),

]

operations = [

migrations.AddField(

model_name='person',

name='first_name',

field=models.CharField(default='',

max_length=50),

preserve_default=False,

),

Page 25: Lo nuevo de Django 1.7 y 1.8

RunPython

def split_names(apps, schema_editor):

Person = apps.get_model('people.Person')

for person in Person.objects.all():

full_name = person.full_name.split(' ')

person.first_name = full_name[0:-1]

person.last_name = last_name[-1]

person.save()

migrations.RunPython(

split_names,

merge_names

)

Page 26: Lo nuevo de Django 1.7 y 1.8

RemoveField

dependencies = [

('people', '0003_split_full_name'),

]

operations = [

migrations.RemoveField(

model_name='person',

name='full_name',

),

]

Page 27: Lo nuevo de Django 1.7 y 1.8

DJANGO 1.8

luego, muy luego...

Page 28: Lo nuevo de Django 1.7 y 1.8

Postgres Specific

Page 29: Lo nuevo de Django 1.7 y 1.8

ArrayField

class ChessBoard(models.Model):

board = ArrayField(

ArrayField(

models.CharField(max_length=10, blank=True),

size=8,

),

size=8,

)

Page 30: Lo nuevo de Django 1.7 y 1.8

HStoreField

class Dog(models.Model):

name = models.CharField(max_length=200)

data = HStoreField()

>>> Dog.objects.create(name='Rufus',

data={'breed': 'labrador'})

>>> Dog.objects.filter(

data__breed='labrador')

Page 31: Lo nuevo de Django 1.7 y 1.8

RangeField

class Event(models.Model):

name = models.CharField(max_length=200)

ages = IntegerRangeField()

>>> Event.objects.create(name='Soft play',

ages=(0, 10))

>>> Event.objects.create(name='Pub trip',

ages=(21, None))

>>> Event.objects.filter(

ages__contains=NumericRange(4, 5))

[<Event: Soft play>]

Page 32: Lo nuevo de Django 1.7 y 1.8

Unaccent!

User.objects.filter(

first_name__unaccent__startswith="Revolv")

Page 33: Lo nuevo de Django 1.7 y 1.8

Conditionals

Expressions

Page 34: Lo nuevo de Django 1.7 y 1.8

SQL Conditional Field

SELECT

”client"."name",

CASE

WHEN ”client"."account_type" = 'G’

THEN '5%'

WHEN ”client"."account_type" = 'P’

THEN '10%' ELSE '0%'

END AS "discount"

FROM

”client"

Page 35: Lo nuevo de Django 1.7 y 1.8

Case, When

>>> Client.objects.annotate(

... discount=Case(

... When(account_type=Client.GOLD,

... then=Value('5%')),

... When(account_type=Client.PLATINUM,

... then=Value('10%')),

... default=Value('0%'),

... output_field=CharField(),

... ),

... ).values_list('name', 'discount')

Page 36: Lo nuevo de Django 1.7 y 1.8

Conditional Update

for cl in Client.objects.all():

if cl.registered <= a_year_ago:

client.account_type = GOLD

elif cl.registerd <= a_month_ago:

client.account_type = PLATINUM

else:

client.account_type = REGULAR

client.save()

Page 37: Lo nuevo de Django 1.7 y 1.8

Conditional Update

Client.objects.update(

account_type=Case(

When(

registered_on__lte=a_year_ago,

then=Value(Client.PLATINUM)),

When(

registered_on__lte=a_month_ago,

then=Value(Client.GOLD)),

default=Value(Client.REGULAR)

),

)

Page 38: Lo nuevo de Django 1.7 y 1.8

Template Engines

Page 39: Lo nuevo de Django 1.7 y 1.8

TEMPLATES setting

TEMPLATES = [

{

'BACKEND':

'django.template.backends.django.DjangoTemplates',

#'django.template.backends.jinja2.Jinja2'

'DIRS': [],

'APP_DIRS': True,

'OPTIONS': {},

},

]

Page 40: Lo nuevo de Django 1.7 y 1.8

Multiple Template Engines

TEMPLATES = [

{

’NAME': 'django'

'BACKEND':

'django.template.backends.django.DjangoTemplates',

},

{

’NAME': ’jinja2'

'BACKEND':

'django.template.backends.jinja2.Jinja2',

},

]

Page 41: Lo nuevo de Django 1.7 y 1.8

My Custom Engine

Page 42: Lo nuevo de Django 1.7 y 1.8

MyEngine

class MyEngine(BaseEngine):

app_dirname = 'dummy'

def __init__(self, params):

...

def from_string(self, template_code):

...

def get_template(self, template_name):

...

Page 43: Lo nuevo de Django 1.7 y 1.8

Template Wrapper

class Template(object):

def __init__(self, template):

...

def render(self, context=None,

request=None):

...

Page 44: Lo nuevo de Django 1.7 y 1.8
Page 45: Lo nuevo de Django 1.7 y 1.8

Django Unchained

Pedro Burón

[email protected]

http://github.com/pedroburon

GRACIAS!