SlideShare ist ein Scribd-Unternehmen logo
1 von 115
Downloaden Sie, um offline zu lesen
A model is blueprint.
from django.db import models
class User(models.Model):
from django.db import models
class User(models.Model):
email = models.EmailField(
max_length=254, unique=True, help_text='Used as the username')
from django.db import models
class User(models.Model):
email = models.EmailField(
max_length=254, unique=True, help_text='Used as the username')
name = models.CharField(max_length=50)
from django.db import models
class User(models.Model):
email = models.EmailField(
max_length=254, unique=True, help_text='Used as the username')
name = models.CharField(max_length=50)
phone = models.CharField(max_length=20, null=True, blank=True)
from django.db import models
class User(models.Model):
email = models.EmailField(
max_length=254, unique=True, help_text='Used as the username')
name = models.CharField(max_length=50)
phone = models.CharField(max_length=20, null=True, blank=True)
STATUS_PAID = 'paid'
STATUS_TRIALING = 'trialing'
from django.db import models
class User(models.Model):
email = models.EmailField(
max_length=254, unique=True, help_text='Used as the username')
name = models.CharField(max_length=50)
phone = models.CharField(max_length=20, null=True, blank=True)
STATUS_PAID = 'paid'
STATUS_TRIALING = 'trialing'
STATUS_CHOICES = (
(STATUS_PAID, 'Paid'),
(STATUS_TRIALING, 'Trialing'),
)
from django.db import models
class User(models.Model):
email = models.EmailField(
max_length=254, unique=True, help_text='Used as the username')
name = models.CharField(max_length=50)
phone = models.CharField(max_length=20, null=True, blank=True)
STATUS_PAID = 'paid'
STATUS_TRIALING = 'trialing'
STATUS_CHOICES = (
(STATUS_PAID, 'Paid'),
(STATUS_TRIALING, 'Trialing'),
)
status = models.CharField(
max_length=20, unique=True, choices=STATUS_CHOICES)
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=>
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> d accounts_user
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> d accounts_user
Table "public.accounts_user"
Column | Type | Modifiers
--------+------------------------+----------------------
id | integer | not null default ...
email | character varying(254) | not null
name | character varying(50) | not null
phone | character varying(20) |
status | character varying(20) | not null
class Message(models.Model):
class Message(models.Model):
sender = models.ForeignKey(
User)
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> d messaging_message
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> d messaging_message
Table "public.messaging_message"
Column | Type | Modifiers
-----------+---------+----------------------
id | integer | not null default ...
sender_id | integer | not null
$ ./manage.py shell_plus
$ ./manage.py shell_plus
In [1]: user = ...
$ ./manage.py shell_plus
In [1]: user = ...
In [2]: user.message_set.all()
Out[2]: [<Message: ...>, <Message: ...>]
class Message(models.Model):
sender = models.ForeignKey(
User)
class Message(models.Model):
sender = models.ForeignKey(
User, related_name='messages_sent')
$ ./manage.py shell_plus
In [1]: user = ...
In [2]: user.message_set.all()
Out[2]: [<Message: ...>, <Message: ...>]
$ ./manage.py shell_plus
In [1]: user = ...
In [2]: user.messages_sent.all()
Out[2]: [<Message: ...>, <Message: ...>]
Object-relational mapping
Model
User
Model
User
Manager
User.objects
Model
User
Manager
User.objects
Queryset
User.objects.all()
User.objects.filter(...)
Model
User
Manager
User.objects
Queryset
User.objects.all()
User.objects.filter(...)
eval via DB
Model
User
Manager
User.objects
Queryset
User.objects.all()
User.objects.filter(...)
Python List
list(User.objects
.all())
eval via DB
User.objects.all() # => queryset
User.objects.all() # => queryset
User.objects.filter(email='...') # => queryset
User.objects.all() # => queryset
User.objects.filter(email='...') # => queryset
User.objects.filter(email='...').count() # DB access
User.objects.filter(email='...')
User.objects.filter(email='...')
User.objects.filter(email='...', first_name='...')
User.objects.filter(email='...')
User.objects.filter(email='...', first_name='...')
User.objects.filter(email='...').filter(first_name='...')
User.objects.filter(email='...')
User.objects.filter(email='...', first_name='...')
User.objects.filter(email='...').filter(first_name='...')
first call creates
QuerySet from Manager
User.objects.filter(email='...')
User.objects.filter(email='...', first_name='...')
User.objects.filter(email='...').filter(first_name='...')
second call transforms
QuerySet into another
QuerySet
first call creates
QuerySet from Manager
User.objects.filter(email='...')
User.objects.filter(email='...').delete()
User.objects.filter(email='...').delete()
User.objects.delete()
User.objects.filter(email='...').delete()
User.objects.delete()
User.objects.filter(email='...').delete()
User.objects.delete()
User.objects.all().delete()
User.objects.filter(email='...').delete()
User.objects.delete()
User.objects.all().delete()
.delete() is only definedon QuerySet, not onManager (for safety)
from django.db.models import Q
from django.db.models import Q
User.objects.filter(Q(email='...'))
from django.db.models import Q
User.objects.filter(Q(email='...') | Q(first_name='...'))
from django.db.models import Q
is_user_query = Q(email='...') | Q(first_name='...')
User.objects.filter(is_user_query)
from django.db.models import Q
is_user_query = Q(email='...') | Q(first_name='...')
User.objects.filter(is_user_query)
transform search
criteria into
first-class value
User.objects.filter(customer_profile=cust_prof_instance)
User.objects.filter(customer_profile__id=123)
User.objects.filter(customer_profile__id__in=[123, 456])
User.objects.filter(customer_profile__isnull=False)
User.objects.filter(invitecodeusage__invite__code='...')
User.objects.filter(invitecodeusage__invite__code='...')
One-to-many: at least
one matching
users = Users.objects.filter(...)
for user in users:
for tm in user.tracked_metrics.all():
print tm.metric.key
users = Users.objects.filter(...)
for user in users:
for tm in user.tracked_metrics.all():
print tm.metric.key
Assume 10 users and16 distinct metrics
users = Users.objects.filter(...)
for user in users:
for tm in user.tracked_metrics.all():
print tm.metric.key
1 - users
10 - tracked metrics
16 - metrics
users = (Users.objects.filter(...)
.prefetch_related('tracked_metrics'))
for user in users:
for tm in user.tracked_metrics.all():
print tm.metric.key
1 - users
1 - tracked metrics
16 - metrics
users = (Users.objects.filter(...)
.prefetch_related('tracked_metrics__metric'))
for user in users:
for tm in user.tracked_metrics.all():
print tm.metric.key
1 - users
1 - tracked metrics
1 - metrics
users = (User.objects
.filter(customer_profile__isnull=False))
for user in users:
print user.customer_profile.uuid
users = (User.objects
.filter(customer_profile__isnull=False))
for user in users:
print user.customer_profile.uuid
Assume 10 users
users = (User.objects
.filter(customer_profile__isnull=False))
for user in users:
print user.customer_profile.uuid
1 - users
10 - customer profiles
users = (User.objects
.filter(customer_profile__isnull=False)
.prefetch_related('customer_profile'))
for user in users:
print user.customer_profile.uuid
1 - users
1 - customer profiles
users = (User.objects
.filter(customer_profile__isnull=False)
.select_related('customer_profile'))
for user in users:
print user.customer_profile.uuid
1 - users
0 - customer profiles
using JOIN
$ ./manage.py makemigrations
$ ./manage.py makemigrations
current
model
definition
$ ./manage.py makemigrations
current
model
definition
model definition
based on applied
migrations
$ ./manage.py makemigrations
current
model
definition
model definition
based on applied
migrations
DIFF
$ ./manage.py makemigrations
$ ./manage.py migrate
$ ./manage.py makemigrations
$ ./manage.py migrate
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=>
$ ./manage.py makemigrations
$ ./manage.py migrate
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> SELECT * FROM django_migrations;
id | app | name | applied
----+--------------+--------------+--------------------------
1 | accounts | 0001_initial | 2016-08-30 11:56:29.798795-07
(1 row)
$ ./manage.py migrate accounts 0002 # to specific version
$ ./manage.py migrate accounts 0002 # to specific version
$ ./manage.py migrate accounts 0001 # rollback
$ ./manage.py migrate accounts 0002 # to specific version
$ ./manage.py migrate accounts 0001 # rollback
$ ./manage.py migrate accounts 0002 --fake # only add to table
vida=> -- faking a migration
vida=>
vida=> -- faking a migration
vida=> INSERT INTO django_migrations (app, name, applied)
VALUES ('accounts', '0003_faked', current_timestamp);
class User(BaseModel):
email = models.EmailField(max_length=254, unique=True)
- phone_number = models.CharField(max_length=50)
class User(BaseModel):
email = models.EmailField(max_length=254, unique=True)
- phone_number = models.CharField(max_length=50)
+class Migration(migrations.Migration):
+ operations = [
+ migrations.RemoveField(
+ model_name='user',
+ name='phone_number',
+ ),
+ ]
User
email
phone_number
User
email
phone_number
Run
migrations
1
User
email
User
email
phone_number
Run
migrations
1
User
email
User
email
phone_number
Run
migrations
Deploy code
1
2
User
email
User
email
class User(BaseModel):
email = models.EmailField(max_length=254, unique=True)
- phone_number = models.CharField(max_length=50)
+class Migration(migrations.Migration):
+ operations = [
+ migrations.RemoveField(
+ model_name='user',
+ name='phone_number',
+ ),
+ ]
class User(BaseModel):
email = models.EmailField(max_length=254, unique=True)
- phone_number = models.CharField(max_length=50)
+class Migration(migrations.Migration):
+ operations = [
+ migrations.RemoveField(
+ model_name='user',
+ name='phone_number',
+ ),
+ ]
Commit and
deploy first.
class User(BaseModel):
email = models.EmailField(max_length=254, unique=True)
- phone_number = models.CharField(max_length=50)
+class Migration(migrations.Migration):
+ operations = [
+ migrations.RemoveField(
+ model_name='user',
+ name='phone_number',
+ ),
+ ]
Commit and
deploy first.
Then commit
and deploy.
User
email
phone_number
User
email
phone_number
User
email
phone_number
User
email
phone_number
Run migrations
(None)
1
Deploy code
(model change only)2
User
email
phone_number
User
email
Run migrations
(None)
1
Deploy code
(model change only)
Run migrations
(remove field)
2
3
User
email
User
email
Run migrations
(None)
1
Deploy code
(model change only)
Run migrations
(remove field)
2
3
User
email
User
email
Run migrations
(None)
1
Deploy code
(None)
4
class User(BaseModel):
- first_name = models.CharField(max_length=50)
- first_name = models.CharField(max_length=50, db_index=True)
class User(BaseModel):
- first_name = models.CharField(max_length=50)
- first_name = models.CharField(max_length=50, db_index=True)
+class Migration(migrations.Migration):
+ operations = [
+ migrations.AlterField(
+ model_name='user',
+ name='first_name',
+ field=models.CharField(max_length=50, db_index=True),
+ ),
+ ]
$ ./manage.py sqlmigrate accounts 0004
$ ./manage.py sqlmigrate accounts 0004
BEGIN;
CREATE INDEX "accounts_user_first_name_a03f23825d126a2_uniq" ON
"accounts_user" ("first_name");
COMMIT;
$ ./manage.py sqlmigrate accounts 0004
BEGIN;
CREATE INDEX "accounts_user_first_name_a03f23825d126a2_uniq" ON
"accounts_user" ("first_name");
COMMIT;
Locks the
entire table!
CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
Running this
is appropriate.
$ aptible ssh --app vida-webserver
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
$ aptible ssh --app vida-webserver
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
CREATE_INDEX
$ aptible ssh --app vida-webserver
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
CREATE_INDEX
vida=> d accounts_user
$ aptible ssh --app vida-webserver
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
CREATE_INDEX
vida=> d accounts_user
vida=> INSERT INTO django_migrations (app, name, applied) VALUES
('accounts', '0004_auto_20160830_1124', current_timestamp);
INSERT 0 1
$ aptible ssh --app vida-webserver
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
CREATE_INDEX
vida=> d accounts_user
vida=> INSERT INTO django_migrations (app, name, applied) VALUES
('accounts', '0004_auto_20160830_1124', current_timestamp);
INSERT 0 1
vida=> SELECT * FROM django_migrations;
$ aptible ssh --app vida-webserver
$ ./manage.py dbshell
psql (9.4.1)
Type "help" for help.
vida=> CREATE INDEX CONCURRENTLY "accounts_user_first_name" ON
"accounts_user" ("first_name");
CREATE_INDEX
vida=> d accounts_user
vida=> INSERT INTO django_migrations (app, name, applied) VALUES
('accounts', '0004_auto_20160830_1124', current_timestamp);
INSERT 0 1
vida=> SELECT * FROM django_migrations;
Now it’s safe
to deploy.

Weitere ähnliche Inhalte

Was ist angesagt?

FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.UA Mobile
 
Meet Magento Belarus debug Pavel Novitsky (eng)
Meet Magento Belarus debug Pavel Novitsky (eng)Meet Magento Belarus debug Pavel Novitsky (eng)
Meet Magento Belarus debug Pavel Novitsky (eng)Pavel Novitsky
 
Web 2 | CSS - Cascading Style Sheets
Web 2 | CSS - Cascading Style SheetsWeb 2 | CSS - Cascading Style Sheets
Web 2 | CSS - Cascading Style SheetsMohammad Imam Hossain
 
Doctrator Symfony Live 2011 San Francisco
Doctrator Symfony Live 2011 San FranciscoDoctrator Symfony Live 2011 San Francisco
Doctrator Symfony Live 2011 San Franciscopablodip
 
Structuring React.js Components
Structuring React.js ComponentsStructuring React.js Components
Structuring React.js ComponentsBartek Witczak
 
4Developers 2018: Structuring React components (Bartłomiej Witczak)
4Developers 2018: Structuring React components (Bartłomiej Witczak)4Developers 2018: Structuring React components (Bartłomiej Witczak)
4Developers 2018: Structuring React components (Bartłomiej Witczak)PROIDEA
 
Forms, Getting Your Money's Worth
Forms, Getting Your Money's WorthForms, Getting Your Money's Worth
Forms, Getting Your Money's WorthAlex Gaynor
 
PyCon KR 2018 Effective Tips for Django ORM in Practice
PyCon KR 2018 Effective Tips for Django ORM in PracticePyCon KR 2018 Effective Tips for Django ORM in Practice
PyCon KR 2018 Effective Tips for Django ORM in PracticeSeomgi Han
 
Powerful Generic Patterns With Django
Powerful Generic Patterns With DjangoPowerful Generic Patterns With Django
Powerful Generic Patterns With DjangoEric Satterwhite
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue AdventureAllegient
 
Presentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-railsPresentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-railsNovelys
 
The Django Book, Chapter 16: django.contrib
The Django Book, Chapter 16: django.contribThe Django Book, Chapter 16: django.contrib
The Django Book, Chapter 16: django.contribTzu-ping Chung
 
DJango admin interface
DJango admin interfaceDJango admin interface
DJango admin interfaceMahesh Shitole
 
Tutorial: Develop an App with the Odoo Framework
Tutorial: Develop an App with the Odoo FrameworkTutorial: Develop an App with the Odoo Framework
Tutorial: Develop an App with the Odoo FrameworkOdoo
 
React Performance
React PerformanceReact Performance
React PerformanceMax Kudla
 

Was ist angesagt? (18)

FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.
 
Meet Magento Belarus debug Pavel Novitsky (eng)
Meet Magento Belarus debug Pavel Novitsky (eng)Meet Magento Belarus debug Pavel Novitsky (eng)
Meet Magento Belarus debug Pavel Novitsky (eng)
 
Web 2 | CSS - Cascading Style Sheets
Web 2 | CSS - Cascading Style SheetsWeb 2 | CSS - Cascading Style Sheets
Web 2 | CSS - Cascading Style Sheets
 
Doctrator Symfony Live 2011 San Francisco
Doctrator Symfony Live 2011 San FranciscoDoctrator Symfony Live 2011 San Francisco
Doctrator Symfony Live 2011 San Francisco
 
Structuring React.js Components
Structuring React.js ComponentsStructuring React.js Components
Structuring React.js Components
 
4Developers 2018: Structuring React components (Bartłomiej Witczak)
4Developers 2018: Structuring React components (Bartłomiej Witczak)4Developers 2018: Structuring React components (Bartłomiej Witczak)
4Developers 2018: Structuring React components (Bartłomiej Witczak)
 
Forms, Getting Your Money's Worth
Forms, Getting Your Money's WorthForms, Getting Your Money's Worth
Forms, Getting Your Money's Worth
 
PyCon KR 2018 Effective Tips for Django ORM in Practice
PyCon KR 2018 Effective Tips for Django ORM in PracticePyCon KR 2018 Effective Tips for Django ORM in Practice
PyCon KR 2018 Effective Tips for Django ORM in Practice
 
HTML Form Part 1
HTML Form Part 1HTML Form Part 1
HTML Form Part 1
 
Powerful Generic Patterns With Django
Powerful Generic Patterns With DjangoPowerful Generic Patterns With Django
Powerful Generic Patterns With Django
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue Adventure
 
Patterns in PHP
Patterns in PHPPatterns in PHP
Patterns in PHP
 
Hibernate
HibernateHibernate
Hibernate
 
Presentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-railsPresentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-rails
 
The Django Book, Chapter 16: django.contrib
The Django Book, Chapter 16: django.contribThe Django Book, Chapter 16: django.contrib
The Django Book, Chapter 16: django.contrib
 
DJango admin interface
DJango admin interfaceDJango admin interface
DJango admin interface
 
Tutorial: Develop an App with the Odoo Framework
Tutorial: Develop an App with the Odoo FrameworkTutorial: Develop an App with the Odoo Framework
Tutorial: Develop an App with the Odoo Framework
 
React Performance
React PerformanceReact Performance
React Performance
 

Ähnlich wie Deep-dive into Django #1

Empower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo MixinsEmpower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo MixinsOdoo
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용KyeongMook "Kay" Cha
 
Angular 2 Component Communication - Talk by Rob McDiarmid
Angular 2 Component Communication - Talk by Rob McDiarmidAngular 2 Component Communication - Talk by Rob McDiarmid
Angular 2 Component Communication - Talk by Rob McDiarmidAmrita Chopra
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Two scoopsofdjango ch16 dealing with the user model
Two scoopsofdjango ch16   dealing with the user modelTwo scoopsofdjango ch16   dealing with the user model
Two scoopsofdjango ch16 dealing with the user modelShih-yi Wei
 
Dependency injection in Scala
Dependency injection in ScalaDependency injection in Scala
Dependency injection in ScalaKnoldus Inc.
 
Odoo Experience 2018 - Inherit from These 10 Mixins to Empower Your App
Odoo Experience 2018 - Inherit from These 10 Mixins to Empower Your AppOdoo Experience 2018 - Inherit from These 10 Mixins to Empower Your App
Odoo Experience 2018 - Inherit from These 10 Mixins to Empower Your AppElínAnna Jónasdóttir
 
Lo nuevo de Django 1.7 y 1.8
Lo nuevo de Django 1.7 y 1.8Lo nuevo de Django 1.7 y 1.8
Lo nuevo de Django 1.7 y 1.8pedroburonv
 
Rails Model Basics
Rails Model BasicsRails Model Basics
Rails Model BasicsJames Gray
 
Ruby on rails
Ruby on rails Ruby on rails
Ruby on rails Mohit Jain
 
Empower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo MixinsEmpower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo MixinsOdoo
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
Desenvolvimento web com Ruby on Rails (parte 3)
Desenvolvimento web com Ruby on Rails (parte 3)Desenvolvimento web com Ruby on Rails (parte 3)
Desenvolvimento web com Ruby on Rails (parte 3)Joao Lucas Santana
 
Django Admin: Widgetry & Witchery
Django Admin: Widgetry & WitcheryDjango Admin: Widgetry & Witchery
Django Admin: Widgetry & WitcheryPamela Fox
 
Optimization in django orm
Optimization in django ormOptimization in django orm
Optimization in django ormDenys Levchenko
 

Ähnlich wie Deep-dive into Django #1 (20)

Empower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo MixinsEmpower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo Mixins
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용
 
Angular 2 Component Communication - Talk by Rob McDiarmid
Angular 2 Component Communication - Talk by Rob McDiarmidAngular 2 Component Communication - Talk by Rob McDiarmid
Angular 2 Component Communication - Talk by Rob McDiarmid
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Two scoopsofdjango ch16 dealing with the user model
Two scoopsofdjango ch16   dealing with the user modelTwo scoopsofdjango ch16   dealing with the user model
Two scoopsofdjango ch16 dealing with the user model
 
Dependency injection in Scala
Dependency injection in ScalaDependency injection in Scala
Dependency injection in Scala
 
Odoo Experience 2018 - Inherit from These 10 Mixins to Empower Your App
Odoo Experience 2018 - Inherit from These 10 Mixins to Empower Your AppOdoo Experience 2018 - Inherit from These 10 Mixins to Empower Your App
Odoo Experience 2018 - Inherit from These 10 Mixins to Empower Your App
 
Django - sql alchemy - jquery
Django - sql alchemy - jqueryDjango - sql alchemy - jquery
Django - sql alchemy - jquery
 
Lo nuevo de Django 1.7 y 1.8
Lo nuevo de Django 1.7 y 1.8Lo nuevo de Django 1.7 y 1.8
Lo nuevo de Django 1.7 y 1.8
 
Django
DjangoDjango
Django
 
Rails Model Basics
Rails Model BasicsRails Model Basics
Rails Model Basics
 
Django Good Practices
Django Good PracticesDjango Good Practices
Django Good Practices
 
Ruby on rails
Ruby on rails Ruby on rails
Ruby on rails
 
Empower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo MixinsEmpower your App by Inheriting from Odoo Mixins
Empower your App by Inheriting from Odoo Mixins
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Desenvolvimento web com Ruby on Rails (parte 3)
Desenvolvimento web com Ruby on Rails (parte 3)Desenvolvimento web com Ruby on Rails (parte 3)
Desenvolvimento web com Ruby on Rails (parte 3)
 
Don't Settle for Poor Names
Don't Settle for Poor NamesDon't Settle for Poor Names
Don't Settle for Poor Names
 
Django Admin: Widgetry & Witchery
Django Admin: Widgetry & WitcheryDjango Admin: Widgetry & Witchery
Django Admin: Widgetry & Witchery
 
Optimization in django orm
Optimization in django ormOptimization in django orm
Optimization in django orm
 
Beyond MVC
Beyond MVCBeyond MVC
Beyond MVC
 

Mehr von Avik Das

Dynamic programming for machine learning: Hidden Markov Models
Dynamic programming for machine learning: Hidden Markov ModelsDynamic programming for machine learning: Hidden Markov Models
Dynamic programming for machine learning: Hidden Markov ModelsAvik Das
 
Using Virtual Reality to Visualize Code
Using Virtual Reality to Visualize CodeUsing Virtual Reality to Visualize Code
Using Virtual Reality to Visualize CodeAvik Das
 
Understanding git
Understanding gitUnderstanding git
Understanding gitAvik Das
 
How to close an issue
How to close an issueHow to close an issue
How to close an issueAvik Das
 
Introduction to asm.js
Introduction to asm.jsIntroduction to asm.js
Introduction to asm.jsAvik Das
 
Sepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.js
Sepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.jsSepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.js
Sepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.jsAvik Das
 

Mehr von Avik Das (6)

Dynamic programming for machine learning: Hidden Markov Models
Dynamic programming for machine learning: Hidden Markov ModelsDynamic programming for machine learning: Hidden Markov Models
Dynamic programming for machine learning: Hidden Markov Models
 
Using Virtual Reality to Visualize Code
Using Virtual Reality to Visualize CodeUsing Virtual Reality to Visualize Code
Using Virtual Reality to Visualize Code
 
Understanding git
Understanding gitUnderstanding git
Understanding git
 
How to close an issue
How to close an issueHow to close an issue
How to close an issue
 
Introduction to asm.js
Introduction to asm.jsIntroduction to asm.js
Introduction to asm.js
 
Sepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.js
Sepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.jsSepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.js
Sepia: How LinkedIn Mobile Made Integration Testing Fast and Reliable in Node.js
 

Deep-dive into Django #1