Админ Django не показывает изменения моделей/задач
У меня запущена задача celery, которая вызывает API для получения некоторого ответа. Если вызов API успешен, то результат сохраняется в redis, чтобы использовать его в качестве выпадающего списка на странице администратора.
Но если ответ API не проходит, то я отключаю опцию добавления на странице администратора Django, которая работает нормально.
Проблема: После неудачи, когда ответ API снова становится успешным, на странице администратора не отображается выпадающий список. Вместо него отображается пустое поле. Чтобы заставить его снова работать, мне приходится перезагружать сервер вручную.
Есть ли способ автоматически перезагружать сервер при изменении ответа API?
Моя модель.py
class Master_Model(models.Model):
template_data = []
try:
if redis_exists is True:
redis_key = RedisCache.find_keys("ID_Number")[0]
template_data = RedisCache.get_data(redis_key)
template_data = ast.literal_eval(template_data)
else:
logger.error("Error occurred while checking redis connection")
except Exception as ex:
logger.error("Error occurred while fetching Ids", exc_info=True)
id = models.SmallAutoField(primary_key=True, serialize=False, verbose_name='ID')
status = models.BooleanField(default=1, verbose_name='active')
template_name = models.CharField(max_length=255, default="", unique=False)
if not template_data:
template_id = models.CharField(max_length=255, default="", unique=True)
else:
template_id = models.CharField(max_length=255, choices=template_data, unique=True)
def __str__(self):
return str(self.template_name)
class Meta:
ordering = ('-id',)
admin.py:
class Master_Admin(admin.ModelAdmin):
@admin.display(description='Template Id')
def template_id(self, obj):
if obj:
return obj.lab_template_id
list_display = ('template_name', 'status')
search_fields = ['template_name']
actions = None
def get_fields(self, request, obj=None):
if obj:
return ['template_name', 'template_id', 'status']
return ['template_id', 'status']
def get_readonly_fields(self, request, obj=None):
if obj:
return ['template_name', 'template_id']
return []
def has_add_permission(self, request, obj=None):
is_redis = RedisCache.is_redis_available()
if is_redis is not True:
return False
redis_key = RedisCache.find_keys("ID_Number")[0]
template_data = RedisCache.get_data(redis_key)
template_data = ast.literal_eval(template_data)
if not template_data:
return False
return True
def save_model(self, request, obj, form, change):
"""
Given a model instance save it to the database.
"""
redis_key = RedisCache.find_keys("ID_Number")[0]
template_data = RedisCache.get_data(redis_key)
template_data = ast.literal_eval(template_data)
for template in template_data:
if obj.template_id == template[0]:
obj.template_name = template[1]
break
obj.save()
PS: Переменная template_data
содержит данные в формате (хранятся в том же формате и в redis с ключом ID_Number
) : (('3313', 'ABC'), ('3241', 'XYZ'))
. На странице администратора будет отображаться только строка, а оба значения кортежа будут храниться в postgresdb.
RedisCache - это класс, который обрабатывает все функции redis.