Присвоение объекта себе внутри метода класса

Я хочу сделать проверку внутри модели, существует ли уже объект в БД или нет, и если он существует, то прочитать все свойства из БД и присвоить тому же объекту.

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')
Вернуться на верх