Предположим, у меня есть модель с полем, ограничивающим другую модель. Например, Thing
, name
которого должен быть в текущем наборе AllowedThingNames
. Набор allow_thing_names изменяется (нечасто) внешним источником. У меня есть код, чтобы получить этот внешний источник и создать AllowedThingNames
по мере необходимости.
Вот код:
models.py:
class AllowedThingName(models.Model):
name = models.CharField(max_length=100, unique=True)
class Thing(models.Model):
name = models.CharField(max_length=100)
def __save__(self, *args, **kwargs):
if AllowedThingName.objects.filter(name=self.name).exists():
return super().save(*args, **kwargs)
return None
tasks.py:
@shared_task
def import_new_names():
response = request.get("some/external/url/where/allowed/names/are/listed")
new_names = clever_way_of_parsing_response(response.content)
for new_name in new_names:
AllowedThingName.objects.get_or_create(name=new_name)
Я создал прибор AllowedThingNames
и запускаю команду loaddata
при запуске.
Я не уверен, что лучший способ - это постоянно обновлять набор AllowedThingNames
.
Одно из решений состоит в том, чтобы периодически (через задачу, cronjob или что-то еще) вызывать функцию import_new_names
, указанную выше, а затем вызывать dumpdata
, чтобы перезаписать прибор. Это сохранит его в БД и обеспечит его повторную загрузку при следующем запуске проекта.
У кого-нибудь в StackOverflow-Land есть идеи получше?