将初始(和正在进行的)数据加载到Django中的标准方法

时间:2018-11-09 15:10:02

标签: django django-fixtures

假设我有一个模型,该模型的字段限制了另一个模型。例如,一个Thing必须位于当前name集合中的AllowedThingNames。一组a​​llow_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 :(得分:1)

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

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

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