【问题标题】:Django - How to link to a legacy database via intermediary?Django - 如何通过中介链接到旧数据库?
【发布时间】:2023-04-04 14:04:01
【问题描述】:

我必须将遗留设计与我的 Django 项目集成,我正在寻找一些关于使用中介的建议。现有设计有效,但现在我需要按第三个表过滤项目。

英文 - 我有一个组织 (Django),它指向许多项目 (Legacy)。但是所有的项目都没有提到那个组织。我有第三个表 ProjectMap,它是通过触发器构建的来解决这个问题。它将 Organization.name 对应到一个项目。

我如何将它们粘合在一起才能让我做到这一点。

projects = Organization.objects.get(pk=1).projects.all()

它不会得到所有的项目,只是那些在第三个表中匹配的项目。这是我到目前为止所拥有的......

顺便说一句,如果有人有更好的策略,我会全力以赴

class Organization(models.Model):
    name = models.CharField(max_length=32)
    projects = models.ManyToManyField(Project)

class Project(models.Model):
    """This is the project info page..

    Note: 'id' does exist and is the pk.
    """
    result_number = models.IntegerField(null=True, db_column='LBLDGRUNNO', blank=True) 
    building_number = models.IntegerField(db_column='LBLDGNO') 
    name = models.CharField(max_length=150, db_column='SPIBLGNAME', blank=True)

    class Meta:
        db_table = u'PROJINFO'
        managed = False

class ProjectMap(models.Model):
    projinfo_table_id = models.IntegerField(null=True) # 'id' of Project
    name = models.CharField(max_length=128, null=True) # 'name' in Organization

非常感谢!

【问题讨论】:

    标签: mysql django django-models


    【解决方案1】:

    不确定这是否是您的要求,但您可以使用 ManyToManyField 上的 through 调用来定义中间表:

    class Organization(models.Model):
        name = models.CharField(max_length=32)
        projects = models.ManyToManyField(Project, through="ProjectOrganisation")
    
    class Project(models.Model):
        #Stuff Here
    
    class ProjectOrganisation(models.Model):
        project = models.ForeignKey(Project)
        organization = models.ForeignKey(Organization)
        #Other Fields Here
    

    无论如何,Django 都会自动使用许多字段来执行此操作,只是如果您想添加额外的字段,这就是这样做的方法。

    【讨论】:

    • 这会更容易但不可能,因为触发器是创建 Map 表的约束,它对我不起作用。一厢情愿,但谢谢!
    • 经过大量返工(包括深入研究 MySQL 触发器 - 哦天哪..),这就是我最终的方向。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2017-11-18
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多