Присвоение объекта себе внутри метода класса
Я хочу сделать проверку внутри модели, существует ли уже объект в БД или нет, и если он существует, то прочитать все свойства из БД и присвоить тому же объекту.
models.py
class Obj1(models.Model)
name
prop1
prop2
prop3
def obj_check(self, name, prop1):
objects = Obj1.object.filter(name=name, prop1=prop1)
len = len(objects)
if len == 0:
# Object does not exists in DB
self.name = name
self.prop1 = prop1
self.save()
return 0
elif len == 1:
# Object does exists in DB
self = objects[0] # <<< Is it possible to do like this?
return 1
else:
# Something wrong, too many objects in DB
return len
main.py
...
obj = Obj1()
check = obj.obj_check(name, var)
if check == 0:
print("Such object does NOT exists")
print("New object created")
elif check == 1:
print("Such object already exists")
obj.prop3 = "New Value"
else:
print("Something wrong, too many objects in DB")
Можно ли/правильно ли сделать вот так? self = objects[0]
Я знаю, что могу использовать try: .. except Obj1.DoesNotExist:
costruction, но хотел сначала создать объект и сделать меньше запросов к БД.
Спасибо!
Нет, переназначение self
на самом деле ничего не делает. Она просто переназначает локальную переменную, она не изменяет объект.
Вы захотите реализовать такой метод как метод менеджера модели. Менеджером по умолчанию для объекта является свойство .objects
, но вы также можете реализовать свой собственный менеджер.
Obj1Manager(models.Manager):
def obj_check(self, name, prop1):
qs = self.get_query()
objects = qs.filter(name=name, prop1=prop1)
n = len(objects)
if n == 0:
# Object does not exists in DB, create it
obj = self.create(name=name, prop1=prop1)
return obj, 1
else:
obj = objects.first()
return obj, 0
class Obj1(models.Model):
objects = Obj1Manager()
# ...
# ....
obj, created = Obj1.objects.obj_check(name='foo', prop1='bar')
Однако стоит отметить, что это уже существует как метод менеджера по умолчанию: get_or_create
.
obj, created = Obj1.objects.get_or_create(name='foo', prop1='bar')