Стандартный способ загрузки начальных (и текущих) данных в Django - PullRequest
0 голосов
/ 09 ноября 2018

Предположим, у меня есть модель с полем, ограничивающим другую модель. Например, 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 есть идеи получше?

1 Ответ

0 голосов
/ 09 ноября 2018

Рассматривали ли вы создание отношения ForeignKey между Thing и AllowedThingName? Что-то вроде

class AllowedThingName(models.Model):
  name = models.CharField(max_length=100, unique=True)

class Thing(models.Model):
  name = models.ForeignKey(AllowedThingName, on_delete=models.CASCASE)
...