| 412 | def get_or_create(self, **kwargs): |
| 413 | # This check needs to be done here, since we can't later remove this |
| 414 | # from the method lookup table, as we do with add and remove. |
| 415 | if through is not None: |
| 416 | raise AttributeError, "Cannot use get_or_create() on a ManyToManyField which specifies an intermediary model. Use %s's Manager instead." % through |
| 417 | assert kwargs, \ |
| 418 | 'get_or_create() must be passed at least one keywoard argument' |
| 419 | defaults = kwargs.pop('defaults', {}) |
| 420 | try: |
| 421 | obj = self.model.objects.get(**kwargs) |
| 422 | except self.model.DoesNotExist: |
| 423 | try: |
| 424 | params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) |
| 425 | params.update(defaults) |
| 426 | obj = self.model(**params) |
| 427 | sid = transaction.savepoint() |
| 428 | obj.save() |
| 429 | transaction.savepoint_commit(sid) |
| 430 | except IntegrityError, e: |
| 431 | transaction.savepoint_rollback(sid) |
| 432 | obj = self.model.objects.get(**kwargs) |
| 433 | self.add(obj) |
| 434 | return obj, False |
| 435 | else: |
| 436 | self.add(obj) |
| 437 | return obj, True |
| 438 | else: |
| 439 | self.add(obj) |
| 440 | return obj, False |
| 441 | get_or_create.alters_data = True |
| 442 | |