36 lines
1,019 B
Python
36 lines
1,019 B
Python
from typing import Union
|
|
|
|
from django.db import models
|
|
|
|
|
|
def is_created_pk(pk):
|
|
return isinstance(pk, str) and pk.startswith('c') and pk[1:].isnumeric()
|
|
|
|
|
|
def get_current_obj(model, pk, only_field=None):
|
|
if is_created_pk(pk):
|
|
return model()
|
|
if only_field is not None:
|
|
return model.objects.only(only_field).get(pk=pk)
|
|
return model.objects.get(pk=pk)
|
|
|
|
|
|
def get_field_value(obj, field: Union[str, models.Field]):
|
|
lang = None
|
|
if isinstance(field, str):
|
|
name = field
|
|
model = type(obj)
|
|
if '__i18n__' in name:
|
|
orig_name, i18n, lang = name.split('__')
|
|
field = model._meta.get_field(orig_name)
|
|
else:
|
|
field = model._meta.get_field(name)
|
|
else:
|
|
name = field.name
|
|
try:
|
|
current_value = getattr(obj, field.attname)
|
|
except AttributeError:
|
|
current_value = field.to_prep_value(getattr(obj, field.name))
|
|
if lang:
|
|
current_value = current_value.get(lang, '')
|
|
return current_value
|