什么是连接这两个Django模型的最佳方式

时间:2017-10-18 20:10:51

标签: python django django-models

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

当我开始研究它时,我已经意识到试验会有一个领先优势并且可能有多个协作者会导致存储同一试验记录的多个副本。所以,我想一次编写试验记录,然后将多家公司连接到记录中。

当我尝试将其他公司连接到试用版时,我的问题就出现了,这很简单,因为公司名称中的公司名称并不总是与我的公司模型完全匹配(即我的公司表格中的公司名称为" Pharma公司公司"和合作者领域是" Pharma Company")。

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

此外,在模型中存储多个外键的最佳方法是什么?或者更好地建立一个帮助表?这里不太确定......

更新 为清晰起见添加代码

我的临床应用中的ClinicalTrial模型

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)

我的信息中心App中的公司模型

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)

1 个答案:

答案 0 :(得分:2)

只需在此处添加ClinicalTrials模型的相关部分:

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.")