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 的最佳实践/建议的主要内容,如果未能解决你的问题,请参考以下文章

Django(python)简单实现android的服务器端

多个设置文件的问题。 Django/Python

颤动中的多向滚动

SpriteKit 多向滚动

python Python多向问题

大脑信号数据处理 | AP | LFP | ECoG | EEG | fNIRS | fMRI