Django/Python:处理多个多向外部 API 的外部 ID 的最佳实践/建议
Posted
技术标签:
【中文标题】Django/Python:处理多个多向外部 API 的外部 ID 的最佳实践/建议【英文标题】:Django/Python: Best Practice/Advice on handling external IDs for Multiple Multi-directional External APIs 【发布时间】:2018-03-18 21:16:53 【问题描述】:所以这更像是一个概念性问题,我真的在寻找能帮助我指明正确方向的人。我正在构建一个中间件平台,我将从入站通道中提取数据,对其进行操作,然后将其推出另一扇门到出站通道。我需要为这些记录中的每一个存储外部 ID,但更重要的是,记录将从多个来源中提取,然后推送到多个来源。我系统中的一条记录需要绑定到任意数量的外部 ID。
一个可以使用的快速模型:
class record(models.Model):
#id
Name = models.CharField(max_length=255, help_text="")
Description = models.CharField(max_length=255, help_text="")
category_id = model.ForeignKey(category)
class category(models.Model):
#id
name = models.CharField(max_length=255, help_text="")
description = models.CharField(max_length=255, help_text="")
class channel(models.Model):
#id
name = models.CharField(max_length=255, help_text="")
inbound = models.BooleanField()
outbound = models.BooleanField()
显然,每次添加新集成时,我都无法为每个模型添加新字段,那将是 90 年代。显而易见的是创建另一个模型来简单地存储具有唯一 ID 的频道和记录 ID,也许这就是答案。
class external_ref(models.Model):
model_name = models.CharfieldField()
internal_id = models.IntegerField()
external_id = models.IntegerField()
channel_id = models.IntegerField()
class Meta:
unique_together = ('model', 'internal_id',)
虽然我的示例仅包含 4 个模型,但我将整合来自 10-20 个不同模型的记录,因此我可以实现全局级别的东西将是最佳的。我考虑过的其他事项:
覆盖基础模型类以创建一个新的“父”类,该类还保存数据库中每个记录的唯一字母数字表示。
创建一个抽象模型来做同样的事情。
可能存储一个带有 channel : external_id 的 json 引用,我可以 ping 每条记录以查看它是否有外部引用。在这方面我真的是一本开放的书,互联网已经变得越来越难以筛选。任何最佳实践或建议将不胜感激。提前致谢。
【问题讨论】:
【参考方案1】:我有这个确切的问题,是的,网络上没有太多关于以这种方式使用 Django 的信息。这就是我正在做的事情 - 使用它的时间还不够长,无法确定它是否是“最佳”方式。
我有一个 IngestedModel 类,它跟踪传入对象的来源以及它们的外部 ID。这也是您放置 unique_together 约束的地方(在 external_id 和源上)
class RawObject(TimeStampedModel):
"""
A Table to keep track of all objects ingested into the database and where they came from
"""
data = models.JSONField()
source = models.ForeignKey(Source,on_delete=models.PROTECT)
class IngestedModel(models.Model):
external_id = models.CharField(max_length=50)
source = models.ForeignKey(Source,on_delete=models.CASCADE)# 1 or 0
raw_objects = models.ManyToManyField(RawObject,blank=True)
class Meta:
abstract = True
然后从摄取的数据创建的每个模型都继承自此 IngestedModel。这样您就可以知道其来源,并且您可以将每个外部对象用于多个内部对象,反之亦然。
class Customer(IngesteModel):
class Order(IngestedModel):
...
etc.
现在这意味着没有“IngestedModel”表,但每个模型都有一个源字段、external_id 和对原始对象的引用(多对多)。这感觉更像是组合而不是继承 - 没有子表对我来说似乎更好。我也很想听听有关“正确”方法的反馈。
【讨论】:
以上是关于Django/Python:处理多个多向外部 API 的外部 ID 的最佳实践/建议的主要内容,如果未能解决你的问题,请参考以下文章