mirror of https://github.com/jumpserver/jumpserver
perf: 搞定自定义 orm field
parent
378eee0402
commit
3cdb81cf4a
|
@ -287,25 +287,21 @@ class RelatedManager:
|
||||||
def __init__(self, instance, field):
|
def __init__(self, instance, field):
|
||||||
self.instance = instance
|
self.instance = instance
|
||||||
self.field = field
|
self.field = field
|
||||||
|
self.value = None
|
||||||
|
|
||||||
def _is_value_stale(self, current_value):
|
def _is_value_stale(self, current_value):
|
||||||
return self.field.value != current_value
|
return self.value != current_value
|
||||||
|
|
||||||
def set(self, value):
|
def set(self, value):
|
||||||
print("set value: {} [{}] ({})".format(self, self.field, value))
|
self.value = value
|
||||||
self._set_value(value)
|
self.instance.__dict__[self.field.name] = value
|
||||||
|
|
||||||
def _set_value(self, value):
|
|
||||||
self.field.value = value
|
|
||||||
if self.instance:
|
|
||||||
self.instance.__dict__[self.field.name] = value
|
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
return self.field.value
|
return self.value
|
||||||
|
|
||||||
def _get_queryset(self):
|
def _get_queryset(self):
|
||||||
model = apps.get_model(self.field.to)
|
model = apps.get_model(self.field.to)
|
||||||
value = self.field.value
|
value = self.value
|
||||||
|
|
||||||
if value["type"] == "all":
|
if value["type"] == "all":
|
||||||
return model.objects.all()
|
return model.objects.all()
|
||||||
|
@ -328,12 +324,10 @@ class RelatedManager:
|
||||||
|
|
||||||
class JSONManyToManyDescriptor:
|
class JSONManyToManyDescriptor:
|
||||||
def __init__(self, field):
|
def __init__(self, field):
|
||||||
print("DES Call __init__: ", field)
|
|
||||||
self.field = field
|
self.field = field
|
||||||
self._is_setting = False
|
self._is_setting = False
|
||||||
|
|
||||||
def __get__(self, instance, owner=None):
|
def __get__(self, instance, owner=None):
|
||||||
print("Call __get__: ", instance, id(instance))
|
|
||||||
if instance is None:
|
if instance is None:
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
@ -342,7 +336,13 @@ class JSONManyToManyDescriptor:
|
||||||
if self.field.name not in instance._related_manager_cache:
|
if self.field.name not in instance._related_manager_cache:
|
||||||
manager = RelatedManager(instance, self.field)
|
manager = RelatedManager(instance, self.field)
|
||||||
instance._related_manager_cache[self.field.name] = manager
|
instance._related_manager_cache[self.field.name] = manager
|
||||||
return instance._related_manager_cache[self.field.name]
|
manager = instance._related_manager_cache[self.field.name]
|
||||||
|
# if self.field.name == 'users':
|
||||||
|
# print(">>> Call __get__: ", manager)
|
||||||
|
# print("Field: ", self.field)
|
||||||
|
# print("Instance: ", instance.__dict__)
|
||||||
|
# print("Current value: ", manager.value)
|
||||||
|
return manager
|
||||||
|
|
||||||
def __set__(self, instance, value):
|
def __set__(self, instance, value):
|
||||||
if instance is None:
|
if instance is None:
|
||||||
|
@ -356,10 +356,12 @@ class JSONManyToManyDescriptor:
|
||||||
else:
|
else:
|
||||||
manager = instance._related_manager_cache[self.field.name]
|
manager = instance._related_manager_cache[self.field.name]
|
||||||
|
|
||||||
print("manager: ", manager)
|
# if self.field.name == 'users':
|
||||||
print("Call __set__: ", id(instance), value)
|
# print(">>> Call __set__: ", manager, value)
|
||||||
|
# print("Field: ", self.field.name)
|
||||||
|
# print("Instance: ", instance.__dict__)
|
||||||
if isinstance(value, RelatedManager):
|
if isinstance(value, RelatedManager):
|
||||||
value = value.field.value
|
value = value.value
|
||||||
manager.set(value)
|
manager.set(value)
|
||||||
|
|
||||||
|
|
||||||
|
@ -380,8 +382,9 @@ class JSONManyToManyField(models.JSONField):
|
||||||
def get_db_prep_value(self, value, connection, prepared=False):
|
def get_db_prep_value(self, value, connection, prepared=False):
|
||||||
if value is None:
|
if value is None:
|
||||||
return None
|
return None
|
||||||
v = value.field.value
|
v = value.value
|
||||||
print("get_db_prep_value: ", value, v)
|
print("$$$ Get_db_prep_value: ", self.to, value, v)
|
||||||
|
print("Value field: ", value.__dict__)
|
||||||
return json.dumps(v)
|
return json.dumps(v)
|
||||||
|
|
||||||
def get_prep_value(self, value):
|
def get_prep_value(self, value):
|
||||||
|
|
Loading…
Reference in New Issue