django tips and_tricks (1)

Post on 23-Jan-2015

2.200 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Django Tips and Tricks

TRANSCRIPT

Django Tips and Tricks

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

Something Went Wrong

Debugging Production# site.wsgi

from whiskey.core import StaffDebugWSGIHandler

application = handlers.StaffDebugWSGIHandler()

Something Useful

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)[]

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 ?!?!?!?!?!?

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

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

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?

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('')

.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('')

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?

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('')

Thanks!

Questions?

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

andy@whiskeymedia.com

We're Hiring!

top related