将初始(和持续)数据加载到 Django 的标准方法

Standard way to load initial (and ongoing) data into Django

假设我有一个模型,其中的一个字段限制了另一个模型。例如,Thingname 必须在 AllowedThingNames 的当前集合中。 allowed_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 来覆盖 fixture。这会将它保存在数据库中,并确保在下次项目重新启动时重新加载它。

Whosebug-Land 中有人有更好的想法吗?

您是否考虑过在 ThingAllowedThingName 之间创建外键关系?类似于

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

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