将初始(和持续)数据加载到 Django 的标准方法
Standard way to load initial (and ongoing) data into Django
假设我有一个模型,其中的一个字段限制了另一个模型。例如,Thing
的 name
必须在 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 中有人有更好的想法吗?
您是否考虑过在 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)
假设我有一个模型,其中的一个字段限制了另一个模型。例如,Thing
的 name
必须在 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 中有人有更好的想法吗?
您是否考虑过在 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)