假设我有一个模型,该模型的字段限制了另一个模型。例如,一个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中的任何人有更好的主意吗?
答案 0 :(得分:1)
您是否考虑过在Thing
和AllowedThingName
之间创建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)