django tips and_tricks (1)

15
Django Tips and Tricks @andymccurdy http://github.com/andymccurdy/django- tips-and-tricks

Upload: andymccurdy

Post on 23-Jan-2015

2.200 views

Category:

Technology


1 download

DESCRIPTION

Django Tips and Tricks

TRANSCRIPT

Page 1: Django tips and_tricks (1)

Django Tips and Tricks

@andymccurdyhttp://github.com/andymccurdy/django-tips-and-tricks

Page 2: Django tips and_tricks (1)

Something Went Wrong

Page 3: Django tips and_tricks (1)

Debugging Production# site.wsgi

from whiskey.core import StaffDebugWSGIHandler

application = handlers.StaffDebugWSGIHandler()

Page 4: Django tips and_tricks (1)

Something Useful

Page 5: Django tips and_tricks (1)

Foreign Key Woesclass Profile(models.Model): name = models.CharField(max_length=64)

class Image(models.Model): profile = models.ForeignKey(Profile)

>>> p = Profile.objects.create(name='andy')>>> i = Image.objects.create(profile=p)>>> p.delete()>>> Image.objects.filter(profile=p)[]

Page 6: Django tips and_tricks (1)

Foreign Key Woesclass Profile(models.Model): name = models.CharField(max_length=64) icon = models.ForeignKey(Image, null=True)

class Image(models.Model): pass

>>> i = Image.objects.create()>>> p = Profile.objects.create(name='andy', icon=i)>>> i.delete()>>> Profile.objects.filter(name='andy')[] # WTF ?!?!?!?!?!?

Page 7: Django tips and_tricks (1)
Page 8: Django tips and_tricks (1)

Main Ticket: #7539First Reported: 6/25/2008 !!!Duplicate Tickets: #10262, #6870, #12382, #12166

Page 9: Django tips and_tricks (1)

NullableForeignKeyfrom whiskey.core import NullableForeignKey

class Profile(models.Model): name = models.CharField(max_length=64) icon = NullableForeignKey(Image)

class Image(models.Model): pass

>>> i = Image.objects.create()>>> p = Profile.objects.create(name='andy', icon=i)>>> i.delete()>>> Profile.objects.filter(name='andy')>>> [<Profile: Profile object>]>>> print Profile.objects.filter(name='andy')[0].iconNone

Page 10: Django tips and_tricks (1)

Concurrency Issuesdef like(request, pk): m = MyObject.objects.get(pk=pk) m.likes += 1 m.save() return HttpResponse('')

What happens if two requests come in at the same time?

Page 11: Django tips and_tricks (1)

Django "F" ExpressionsNew in Django 1.1

from django.db.models import F

def like(request, pk): m = MyObject.objects.get(pk=pk) m.likes = F('likes') + 1 m.save() return HttpResponse('')

Page 12: Django tips and_tricks (1)

.save() Updates All Fieldsfrom django.db.models import F

def like(request, pk): m = MyObject.objects.get(pk=pk) m.likes = F('likes') + 1 m.save() # race condition with "hates" return HttpResponse('')

def hate(request, pk): m = MyObject.objects.get(pk=pk) m.hates = F('hates') + 1 m.save() # race condition with "likes" return HttpResponse('')

Page 13: Django tips and_tricks (1)

QuerySet.update()from django.db.models import F

def like(request, pk): MyObject.objects.filter(pk=pk).update( likes=F('likes') + 1) return HttpResponse('')

def hate(request, pk): MyObject.objects.filter(pk=pk).update( likes=F('hates') + 1) return HttpResponse('')

That's a lot of typing.What about ORM cache invalidation?

Page 14: Django tips and_tricks (1)

Even Easierfrom whiskey.core import update

def like(request, pk): m = MyObject.objects.get(pk=pk) update(m, likes=F('likes') + 1) return HttpResponse('')

def hate(request, pk): m = MyObject.objects.get(pk=pk) update(m, hates=F('hates') + 1) return HttpResponse('')

Page 15: Django tips and_tricks (1)

Thanks!

Questions?

http://github.com/andymccurdy/django-tips-and-tricks@andymccurdy

[email protected]

We're Hiring!