import wsgiref.handlers from google.appengine.ext import db, webapp class MyModel(db.Model): first = db.StringProperty() last = db.StringProperty() class UniqueConstraint(db.Model): @classmethod def check(cls, model, **values): # Create a pseudo-key for use as an entity group. parent = db.Key.from_path(model.kind(), 'unique-values') # Build a list of key names to test. key_names = [] for key in values: key_names.append('%s:%s' % (key, values[key])) def txn(): result = cls.get_by_key_name(key_names, parent) for test in result: if test: return False for key_name in key_names: uc = cls(key_name=key_name, parent=parent) uc.put() return True return db.run_in_transaction(txn) class TestHandler(webapp.RequestHandler): def get(self): def write(msg): self.response.out.write(msg + '\n') def create(first, last): if UniqueConstraint.check(MyModel, first=first, last=last): write('Creating %s %s!' % (first, last)) mm = MyModel(first=first, last=last) mm.put() return True else: write('Darnit, "%s" or "%s" is taken!' % (first, last)) return False write('
')
        write('Clearing data!')
        for mm in MyModel.all():
            mm.delete()
        for uc in UniqueConstraint.all():
            uc.delete()
        write('Done!')
        write('---')

        for i in xrange(4):
            if not create('Bob', 'Doe'):
                if not create('Bob', 'Foo'):
                    if not create('Bar', 'Foo'):
                        if not create('Jane', 'Boo'):
                            write('We\'re all out of luck!')
            write('---')

        write('Data in the datastore:')

        for mm in MyModel.all():
            write('MyModel: %s %s' % (mm.first, mm.last))

        for uc in UniqueConstraint.all():
            write('UniqueConstraint: %s → %s → %s' % (
                uc.key().parent().kind(), uc.key().parent().name(),
                uc.key().name()))

        write('
') def main(): application = webapp.WSGIApplication([ ('/test', TestHandler), ]) wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__': main()