sunscrapers.comYour favored tech partner.
Thick QuerySets and Thin Models, or
Where to Put Business Logic in
Django
Michał Nakoneczny
2017-05-19
sunscrapers.comYour favored tech partner.
A layer which encodes the real-world business rules that
determine how data can be created, displayed, stored, and
changed.
Business Logic Layer
sunscrapers.comYour favored tech partner.
Idea 1: Fat Models
sunscrapers.comYour favored tech partner.
A Company Blog
class Post(Model):
STATUS_DRAFT, STATUS_APPROVED, STATUS_PUBLISHED = range(3)
STATUS_CHOICES = (
(STATUS_DRAFT, _('Draft')),
(STATUS_APPROVED, _('Approved')),
(STATUS_PUBLISHED, _('Published'))
)
title = models.CharField(max_length=255)
text = models.TextField()
status = models.PositiveSmallIntegerField(
choices=STATUS_CHOICES,
default=STATUS_DRAFT
)
sunscrapers.comYour favored tech partner.
BL: Approving and Publishing
class Post(Model):
...
def approve(self):
self.status = Post.STATUS_APPROVED
self.save()
def publish(self):
if self.status != Post.STATUS_APPROVED:
raise PostInvalidStatusError()
self.status = Post.STATUS_APPROVED
self.save()
sunscrapers.comYour favored tech partner.
Pros:
● Testable;
● Readable;
● DRY?
Cons:
● Unmaintanable in a large code base;
● Leads to unoptimised solutions.
Idea 1: Fat Models
sunscrapers.comYour favored tech partner.
Idea 2: Forms/Views/Serializers
sunscrapers.comYour favored tech partner.
sunscrapers.comYour favored tech partner.
Idea 3: Services
sunscrapers.comYour favored tech partner.
BL: Approving and Publishing
def approve_post(post):
post.status = Post.STATUS_APPROVED
post.save()
def publish_post(post):
if post.status != Post.STATUS_APPROVED:
raise PostInvalidStatusError()
post.status = Post.STATUS_APPROVED
post.save()
sunscrapers.comYour favored tech partner.
Pros:
● Testable;
● Readable?;
● DRY
Cons:
● Unstructured in a large code base;
● Can lead to unoptimised solutions.
Idea 3: Services
sunscrapers.comYour favored tech partner.
Idea 4: QuerySets/Managers
sunscrapers.comYour favored tech partner.
BL: Approving and Publishing
class PostQuerySet(QuerySet):
def approve(self):
return self.update(status=Post.STATUS_APPROVED)
def publish(self):
return self.filter(status=Post.STATUS_APPROVED).update(
status=Post.STATUS_PUBLISHED)
class Post(Model):
...
objects = PostQuerySet.as_manager()
sunscrapers.comYour favored tech partner.
Pros:
● Testable;
● Readable;
● DRY;
● Optimised (unless you do something stupid).
Cons:
● Checking Business Logic rules is more complicated.
● Integrations get more difficult.
Idea 4: QuerySets/Managers
sunscrapers.comYour favored tech partner.
Business Logic Rules
def publish(self):
return self.filter(status=Post.STATUS_APPROVED).update(
status=Post.STATUS_PUBLISHED)
def publish(self):
if self.exclude(status=Post.STATUS_APPROVED).exists():
raise PostInvalidStatusError()
return self.update(status=Post.STATUS_PUBLISHED)
sunscrapers.comYour favored tech partner.
Integrations
def pay(self):
Posts_data = …
pay_service = PayService()
try:
pay_service.pay_batch(posts_data)
return self.update (status=Post.STATUS_PAID)
except …:
...
sunscrapers.comYour favored tech partner.
Thanks!
Questions?

More Related Content

PPT
Thailandia_elisa
PPT
The city of_paris
PPT
Thailandia-ELISA
PPTX
Presentazione Repubblica Sudafricana
ODP
Parigi
PPT
Danimarca (Malo)
PPTX
La Norvegia
PPTX
Libia - Dei
Thailandia_elisa
The city of_paris
Thailandia-ELISA
Presentazione Repubblica Sudafricana
Parigi
Danimarca (Malo)
La Norvegia
Libia - Dei

What's hot (8)

PPTX
Port of Riga Presentation
ODP
REPUBBLICA CECA
PPT
14 Juillet
PPTX
La Finlandia
ODP
Presentazione power point finlandia
PPT
ODP
Paesi bassi
PPTX
GSMA OneAPI Gateway Launch Presentation
Port of Riga Presentation
REPUBBLICA CECA
14 Juillet
La Finlandia
Presentazione power point finlandia
Paesi bassi
GSMA OneAPI Gateway Launch Presentation
Ad

Similar to Fat query sets and Skinny Models (20)

PPTX
Django ORM - Marcin Markiewicz
PDF
SSRS Report with Parameters and Data Filtration
PDF
Agile Data Science 2.0
PDF
01_pytorch_workflow jutedssd huge hhgggdf
PPTX
Discovering Django - zekeLabs
PDF
Bulletproof Jobs: Patterns For Large-Scale Spark Processing
PDF
70433 Dumps DB
PDF
Supercharging your Organic CTR
PDF
Agile Data Science 2.0
PDF
Agile Data Science 2.0 - Big Data Science Meetup
PPTX
Django and working with large database tables
PPTX
Quickstartguidetojavascriptframeworksforsharepointapps spsbe-2015-15041903264...
PPTX
Quick start guide to java script frameworks for sharepoint apps spsbe-2015
PPTX
Drools rule Concepts
PDF
RicoLiveGrid
PDF
RicoLiveGrid
PDF
Sales force certification-lab
PPTX
Tutorial: Develop an App with the Odoo Framework
PDF
Crack4sure microsoft az-500 dumps
PPTX
MS SQL Server: Data mining concepts and dmx
Django ORM - Marcin Markiewicz
SSRS Report with Parameters and Data Filtration
Agile Data Science 2.0
01_pytorch_workflow jutedssd huge hhgggdf
Discovering Django - zekeLabs
Bulletproof Jobs: Patterns For Large-Scale Spark Processing
70433 Dumps DB
Supercharging your Organic CTR
Agile Data Science 2.0
Agile Data Science 2.0 - Big Data Science Meetup
Django and working with large database tables
Quickstartguidetojavascriptframeworksforsharepointapps spsbe-2015-15041903264...
Quick start guide to java script frameworks for sharepoint apps spsbe-2015
Drools rule Concepts
RicoLiveGrid
RicoLiveGrid
Sales force certification-lab
Tutorial: Develop an App with the Odoo Framework
Crack4sure microsoft az-500 dumps
MS SQL Server: Data mining concepts and dmx
Ad

More from Sunscrapers (11)

PDF
DVCS Workflows for Teams - Bartek Rychlicki
PDF
Swift - Krzysztof Skarupa
PDF
How to justify your recommendation - Łukasz Karwacki
PPTX
PostgreSQL and JSON with Python - Przemek Lewandowski
PPTX
Py2 - Py3 migration - Krzysztof Skarupa
PPTX
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
PPTX
Reactive programming
PPTX
Foundations of Foundation 6 - Jakub Włodaczyk (pl)
PDF
Jaka przyszłość czeka polskich programistów?
PDF
Interruptions
PDF
Creating value for customers - understanding context
DVCS Workflows for Teams - Bartek Rychlicki
Swift - Krzysztof Skarupa
How to justify your recommendation - Łukasz Karwacki
PostgreSQL and JSON with Python - Przemek Lewandowski
Py2 - Py3 migration - Krzysztof Skarupa
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
Reactive programming
Foundations of Foundation 6 - Jakub Włodaczyk (pl)
Jaka przyszłość czeka polskich programistów?
Interruptions
Creating value for customers - understanding context

Recently uploaded (20)

PPTX
INDIGENOUS-LANGUAGES-AND-LITERATURE.pptx
PDF
Microsoft-365-Administrator-s-Guide_.pdf
PPTX
3RD-Q 2022_EMPLOYEE RELATION - Copy.pptx
PPTX
Kompem Part Untuk MK Komunikasi Pembangunan 5.pptx
PDF
PM Narendra Modi's speech from Red Fort on 79th Independence Day.pdf
PDF
public speaking for kids in India - LearnifyU
PDF
5_tips_to_become_a_Presentation_Jedi_@itseugenec.pdf
PDF
Module 7 guard mounting of security pers
PPTX
NORMAN_RESEARCH_PRESENTATION.in education
PPTX
CAPE CARIBBEAN STUDIES- Integration-1.pptx
PPTX
FINAL TEST 3C_OCTAVIA RAMADHANI SANTOSO-1.pptx
PPTX
Copy- of-Lesson-6-Digestive-System.pptx
PPTX
Module_4_Updated_Presentation CORRUPTION AND GRAFT IN THE PHILIPPINES.pptx
PPTX
CASEWORK Power Point Presentation - pointers
PPTX
HOW TO HANDLE THE STAGE FOR ACADEMIA AND OTHERS.pptx
PPTX
power point presentation ofDracena species.pptx
PDF
Presentation on cloud computing and ppt..
PPTX
PurpoaiveCommunication for students 02.pptx
PPTX
Sustainable Forest Management ..SFM.pptx
PPTX
Literatura en Star Wars (Legends y Canon)
INDIGENOUS-LANGUAGES-AND-LITERATURE.pptx
Microsoft-365-Administrator-s-Guide_.pdf
3RD-Q 2022_EMPLOYEE RELATION - Copy.pptx
Kompem Part Untuk MK Komunikasi Pembangunan 5.pptx
PM Narendra Modi's speech from Red Fort on 79th Independence Day.pdf
public speaking for kids in India - LearnifyU
5_tips_to_become_a_Presentation_Jedi_@itseugenec.pdf
Module 7 guard mounting of security pers
NORMAN_RESEARCH_PRESENTATION.in education
CAPE CARIBBEAN STUDIES- Integration-1.pptx
FINAL TEST 3C_OCTAVIA RAMADHANI SANTOSO-1.pptx
Copy- of-Lesson-6-Digestive-System.pptx
Module_4_Updated_Presentation CORRUPTION AND GRAFT IN THE PHILIPPINES.pptx
CASEWORK Power Point Presentation - pointers
HOW TO HANDLE THE STAGE FOR ACADEMIA AND OTHERS.pptx
power point presentation ofDracena species.pptx
Presentation on cloud computing and ppt..
PurpoaiveCommunication for students 02.pptx
Sustainable Forest Management ..SFM.pptx
Literatura en Star Wars (Legends y Canon)

Fat query sets and Skinny Models

  • 1. sunscrapers.comYour favored tech partner. Thick QuerySets and Thin Models, or Where to Put Business Logic in Django Michał Nakoneczny 2017-05-19
  • 2. sunscrapers.comYour favored tech partner. A layer which encodes the real-world business rules that determine how data can be created, displayed, stored, and changed. Business Logic Layer
  • 3. sunscrapers.comYour favored tech partner. Idea 1: Fat Models
  • 4. sunscrapers.comYour favored tech partner. A Company Blog class Post(Model): STATUS_DRAFT, STATUS_APPROVED, STATUS_PUBLISHED = range(3) STATUS_CHOICES = ( (STATUS_DRAFT, _('Draft')), (STATUS_APPROVED, _('Approved')), (STATUS_PUBLISHED, _('Published')) ) title = models.CharField(max_length=255) text = models.TextField() status = models.PositiveSmallIntegerField( choices=STATUS_CHOICES, default=STATUS_DRAFT )
  • 5. sunscrapers.comYour favored tech partner. BL: Approving and Publishing class Post(Model): ... def approve(self): self.status = Post.STATUS_APPROVED self.save() def publish(self): if self.status != Post.STATUS_APPROVED: raise PostInvalidStatusError() self.status = Post.STATUS_APPROVED self.save()
  • 6. sunscrapers.comYour favored tech partner. Pros: ● Testable; ● Readable; ● DRY? Cons: ● Unmaintanable in a large code base; ● Leads to unoptimised solutions. Idea 1: Fat Models
  • 7. sunscrapers.comYour favored tech partner. Idea 2: Forms/Views/Serializers
  • 9. sunscrapers.comYour favored tech partner. Idea 3: Services
  • 10. sunscrapers.comYour favored tech partner. BL: Approving and Publishing def approve_post(post): post.status = Post.STATUS_APPROVED post.save() def publish_post(post): if post.status != Post.STATUS_APPROVED: raise PostInvalidStatusError() post.status = Post.STATUS_APPROVED post.save()
  • 11. sunscrapers.comYour favored tech partner. Pros: ● Testable; ● Readable?; ● DRY Cons: ● Unstructured in a large code base; ● Can lead to unoptimised solutions. Idea 3: Services
  • 12. sunscrapers.comYour favored tech partner. Idea 4: QuerySets/Managers
  • 13. sunscrapers.comYour favored tech partner. BL: Approving and Publishing class PostQuerySet(QuerySet): def approve(self): return self.update(status=Post.STATUS_APPROVED) def publish(self): return self.filter(status=Post.STATUS_APPROVED).update( status=Post.STATUS_PUBLISHED) class Post(Model): ... objects = PostQuerySet.as_manager()
  • 14. sunscrapers.comYour favored tech partner. Pros: ● Testable; ● Readable; ● DRY; ● Optimised (unless you do something stupid). Cons: ● Checking Business Logic rules is more complicated. ● Integrations get more difficult. Idea 4: QuerySets/Managers
  • 15. sunscrapers.comYour favored tech partner. Business Logic Rules def publish(self): return self.filter(status=Post.STATUS_APPROVED).update( status=Post.STATUS_PUBLISHED) def publish(self): if self.exclude(status=Post.STATUS_APPROVED).exists(): raise PostInvalidStatusError() return self.update(status=Post.STATUS_PUBLISHED)
  • 16. sunscrapers.comYour favored tech partner. Integrations def pay(self): Posts_data = … pay_service = PayService() try: pay_service.pay_batch(posts_data) return self.update (status=Post.STATUS_PAID) except …: ...
  • 17. sunscrapers.comYour favored tech partner. Thanks! Questions?