Have you tried http://www.web2pyslices.com/main/slices/take_slice/112
I remember it did check for already done rating and doesn't allow rate twice by the same user on same object. May be you can just use it or look at the code and adapt it to your application. That's really not that big, only a controller and a model with few lines. 30-60 may be.

