【问题标题】:What's the best way to connect these two Django models连接这两个 Django 模型的最佳方法是什么
【发布时间】:2017-10-18 20:10:51
【问题描述】:

在一个 Django 项目中,我有一个 Companies 模型,并且正在组合一个 ClinicalTrials 模型 (CT),这两个模型目前都存储在 SQlite3 数据库中。我最初的计划是在用户访问公司页面时查询 CT.gov API 以获取 company_name,并将结果存储在 CT 模型中,将公司的主键从 Companies 模型映射到 CT 模型中的外键。

不过,当我开始研究它时,我意识到一个试验会有一个线索,并且可能有多个协作者,这将导致存储同一试验记录的多个副本。所以,我想写一次试用记录,然后将多个公司连接到记录。

当我尝试将其他公司连接到试用版时,我的问题出现了,原因很简单,因为跟踪中的公司名称在我的 Companies 模型中并不总是完全匹配(即,我的 Companies 表的 company_name 为“Pharma Company Inc. ”,合作者领域是“制药公司”)。

最好使用正则表达式搜索 Companies 模型吗?有更好的解决方案吗?

另外,在模型中存储多个外键的最佳方式是什么?还是建一个辅助表更好?这里不太确定...

更新 为清楚起见添加代码

我的临床试验应用程序中的临床试验模型

class ClinicalTrials(models.Model):
    pk = models.CharField(primary_key=True, max_length=50, blank=False, null=False)
    involvement = models.CharField(max_length=100, blank=False)
    current_trial_status = models.CharField(max_length=200, blank=True)
    current_trial_status_date = models.DateField(null=True)
    start_date = models.DateField(null=True)
    start_date_type_code = models.CharField(max_length=200, blank=True)
    completion_date = models.DateField(null=True)
    completion_date_type_code = models.CharField(max_length=200, blank=True)
    record_verification_date = models.CharField(max_length=200, blank=True)
    brief_title = models.CharField(max_length=200, blank=True)
    official_title = models.CharField(max_length=200, blank=True)
    brief_summary = models.CharField(max_length=200, blank=True)
    study_protocol_type = models.CharField(max_length=200, blank=True)
    primary_purpose_code = models.CharField(max_length=200, blank=True)
    lead_org = models.CharField(max_length=200, blank=True)
    phase = models.CharField(max_length=200, blank=True)
    minimum_target_accrual_number = models.CharField(max_length=200, blank=True)
    number_of_arms = models.CharField(max_length=200, blank=True)

我的仪表板应用程序中的公司模型

class Company(models.Model):
    stock_symbol = models.CharField(max_length=5, unique=False)
    company_name = models.CharField(max_length=200)
    address_1 = models.CharField(max_length=100, blank=True)
    address_2 = models.CharField(max_length=100, blank=True)
    city = models.CharField(max_length=25, blank=True)
    state = models.CharField(max_length=2, blank=True)
    zip_code = models.IntegerField(null=True)
    country = models.CharField(max_length=25, blank=True)

【问题讨论】:

  • 仅用英语解释模型很难理解。如果您可以发布模型的相关部分,应该会更有帮助。无论如何,据我了解,您需要在模型之间创建多对多关系,而不是 ForeignKey。
  • 我以前没有使用过多对多关系,但这似乎是连接它们的正确方式。只需要弄清楚如何查找不完全匹配的公司名称...
  • 我猜您还没有添加您在问题中提到的collaborator 字段。将 lead_org 字段更改为 ForeignKey 并将 collaborator 字段作为 ManyToMany 关系添加到 Company 模型应该适合您。

标签: python django django-models


【解决方案1】:

只需在此处添加您的临床试验模型的相关部分:

class ClinicalTrials(models.Model):
    ...
    lead_org = models.ForeignKey(Company)
    ...
    collaborator = Models.ManyToManyField(Company)
    ...

然后,如果您想获取“Pharma Company Inc.”的所有 ClinicalTrial 对象。是主角,你只需要写下面的过滤器

ClinicalTrials.objects.filter(lead_org__name="Pharma Company Inc.")

如果您想获取“Pharma Company Inc.”的所有 ClinicalTrial 对象。是的合作者,你可以写:

ClinicalTrials.objects.filter(collaborator__name="Pharma Company Inc.")

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多