1 | class Manager(models.Manager): |
---|
2 | """Provides the update_or_create method for regular managers. |
---|
3 | |
---|
4 | This will call get_or_create, and if an object is not created, it |
---|
5 | will update the object with the contents of the defaults parameter |
---|
6 | and save it.""" |
---|
7 | |
---|
8 | def update_or_create(self, **kwargs): |
---|
9 | obj, created = self.get_or_create(**kwargs) |
---|
10 | if not created and "defaults" in kwargs: |
---|
11 | for k, v in kwargs.get("defaults", {}).items(): |
---|
12 | if k not in dir(obj): |
---|
13 | raise AttributeError("Invalid attribute %s provided for update on %s (%d)" % (k, type(obj), obj.pk)) |
---|
14 | |
---|
15 | setattr(obj, k, v) |
---|
16 | obj.save() |
---|
17 | |
---|
18 | return obj, created |
---|