Django / Python:处理多个多向外部API的外部ID的最佳实践/建议

时间:2017-10-07 03:22:07

标签: python django integration api-design

所以这更像是一个概念性问题,我真的在寻找帮助我指向正确方向的人。我正在构建一个中间件平台,我将从入站通道中提取数据,操纵它,然后将其从另一扇门推出到出站通道。我需要为每个记录存储外部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 个答案:

答案 0 :(得分:0)

我有这个确切的问题,是的,网络上没有太多关于以这种方式使用 Django 的信息。这是我在做什么 - 使用它的时间还不够长,无法确定它是否是“最佳”方式。

我有一个 IngestedModel 类,它跟踪传入对象的来源及其外部 ID。这也是您放置 unique_together 约束的地方(在 external_id 和 source 上)

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。这样您就知道它的来源,并且您可以将每个外部对象用于 1 个以上的内部对象,反之亦然。

class Customer(IngesteModel):
class Order(IngestedModel): 
...
etc.  

现在这意味着没有“IngestedModel”表,但每个模型都有一个字段用于源、external_id 和对原始对象(多对多)的引用。这感觉更多的是组合而不是继承 - 没有子表对我来说似乎更好。我也很想听到有关“正确”执行此操作的反馈。