所以这更像是一个概念性问题,我真的在寻找帮助我指向正确方向的人。我正在构建一个中间件平台,我将从入站通道中提取数据,操纵它,然后将其从另一扇门推出到出站通道。我需要为每个记录存储外部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个不同模型的记录,因此我可以实现全局级别的最佳选择。我考虑过的其他事情:
覆盖基础模型类以创建一个新的“父”类,该类还将数据库中每条记录的字母数字表示形式保存为唯一。
创建一个抽象模型来做同样的事情。
我真的是一本关于此的开放式书籍,互联网越来越难以筛选。任何最佳实践或建议将不胜感激。提前谢谢。
答案 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 和对原始对象(多对多)的引用。这感觉更多的是组合而不是继承 - 没有子表对我来说似乎更好。我也很想听到有关“正确”执行此操作的反馈。