Django的ORM实现数据库设计

  1. 病人信息表
class Patient(models.Model):
    SEX = (('M', 'Male'), ('F', 'Female'))
    patient_ogid = models.CharField(max_length=20)
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    gender= models.CharField(max_length=1, choices=self.SEX)
    id_number = models.CharField(max_length=18)
    hospital = models.CharField(max_length=200, default='-')
    doctor = models.CharField(max_length=100, default='-')
    addresss = models.CharField(max_length=300, default='-')
    telephone = models.CharField(max_length=15, default='-')
    package = models.ForeignKey(Package, ondelete=models.CASCADE)
    cancer = models.ForeignKey(Tumor, ondelete=models.CASCADE)

    def __str__(self):
        return self.name
  1. 样品信息表
class Sample(models.Model):
    sample_type = models.CharField(max_length=20)
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE, related_name="samples")
    ammount = models.IntegerField()
    unit = models.CharField(max_length=10)
    sampling_date = models.DateField()
    notes = models.CharField(max_length=100, blank=True)

    def __str__(self):
        return '_'.join([self.patient.name, self.sample_type])
  1. 测序记录表(包括关联外键的两个表)
class Tissues(models.Model):
    name = models.CharField('Tissue name', max_length=20, primary_key=True)
    full_name = models.CharField('Tissue full name', max_length=100, blank=True)

    def __str__(self):
        return self.tissue_short_name

class Panel(models.Model):
    panel_name = models.CharField('Panel name', max_length=50, primary_key=True)
    panel_path = models.CharField('Panel full path', max_length=500)
    panel_type = models.CharField('Panel type', max_length=20)
    panel_subtype = models.CharField('Panel subtype', max_length=20, default='unknown')

    def __str__(self):
        return self.panel_name

class Record(models.Model):
    sample = models.ForeignKey(Sample, on_delete=models.CASCADE, related_name="records")
    full_id = models.CharField('Full ID', max_length=100, unique=True)
    og_id = models.CharField('OG ID', max_length=100)
    capm = models.CharField('CA-PM', max_length=100)
    r1 = models.CharField('R1', max_length=500)
    r2 = models.CharField('R2', max_length=500)
    tissue = models.ForeignKey(Tissues, on_delete=models.CASCADE)
    panel = models.ForeignKey(Panel, on_delete=models.CASCADE)
    create_date = models.DateTimeField('Disk date')
    r1_size = models.IntegerField('R1 Size (MB)', max_length=10, default=-1)
    r2_size = models.IntegerField('R2 Size (MB)', max_length=10, default=-1)
    indb_date = models.DateTimeField( 'In DB date', auto_now_add=True)
    outdate_status = models.Boolean('Is Outdate?', default=False)
    qc = models.CharField('QC', max_length=500, default='-')
  1. 基因位点表
class Site(models.Model):
    chrom = models.CharField(max_length=2)
    start = models.CharField(max_length=15)
    end = models.CharField(max_length=15)
    ref = models.CharField(max_length=1000)
    gene = models.ForeignKey(Gene, on_delete=models.CASCADE)
    nm_id = models.CharField(max_length=30)
    exon_id = models.CharField(max_length=10)

    @property
    def site_info1(self):
        return [self.chrom, self.start, self.end, self.ref]
    def site_info2(self):
        return [self.gene, self.nm_id, self.exon_id]
  1. 变异信息表
class Snv(models.Model):
    site = models.ForeignKey(Site, on_delete=models.CASCADE)
    alt = models.CharField(max_length=100)
    canno = models.CharField(max_length=100)
    panno = models.CharField(max_length=100)
    variant_type = models.CharField(max_length=30)
    rs_number = models.CharField(max_length=20, default='.')
    kgmaf = models.FloatField(max_length=20, default='0')
    sift = models.CharField(max_length=1, default='.')
    polyphen2 = models.CharField(max_length=1, default='.')

    @property
    def snv_info(self):
        return self.site.site_info1 + [self.alt] + self.site.info 2+ [self.canno, self.panno, self.variant_type, self.rs_number, self.kgmaf, self.sift, self.polyphen2]

  1. 测序变异信息
class Seqvars(models.Model):
    ngs_record = models.ForeignKey(Record, on_delete=models.CASCADE, related_name="seqvars")
    snv = models.ForeignKey(Snv, on_delete=models.CASCADE)
    vf = models.FloatField()
    total_dp = models.IntegerField()
    var_dp = models.IntegerField()
    mole = models.IntegerField()
   
    @property
    def seqvar_info(self):
        return self.snv.snv_info + [self.vf, self.total_dp, self.var_dp, self.mole]
  1. 套餐信息(+套餐基因)
class Package(models.Model):
    name = models.CharField(max_length=50)
    price = models.FloatField()
    tumor = models.ForeignKey(Tumor, on_delete=modelsCASCADE)
    gene = models.ManyToMany(Gene, related_name='genes')
  1. 基因表
class Gene(models.Model):
    symbol = models.CharField(max_length=30)
    full_name = models.CharField(max_length=100)
    detail = models.TextField()
    entrez_id = models.CharField(max_length=10)
    ensg_id = models.CharField(max_length=30)
  1. 癌症信息表
class Tumor(models.Model):
    name = models.CharField(max_length=30)
    detail = models.TextField()
    notes = models.CharField(max_length=50, blank=True)
  1. 拷贝数变异与基因融合
class Cnv(models.Model):
    ngs_record = models.ForeignKey(Record, on_delete=models.CASCADE)
    gene = models.ForeignKey(Gene, on_delete=models.CASCADE)
    start = models.CharField(max_length=10)
    end = mdoels.CharField(max_length=10)
    copynum = models.IntegerField()


class Fusion(models.Model):
    ngs_record = models.ForeignKey(Record, on_delete=models.CASCADE)
    gene1 = models.ForeignKey(Gene, on_delete=models.CASCADE, related_name='gene1')
    start1 = models.CharField(max_length=10)
    end 1= mdoels.CharField(max_length=10)
    gene2 = models.ForeignKey(Gene, on_delete=models.CASCADE, related_name='gene2')
    start2 = models.CharField(max_length=10)
    end2 = mdoels.CharField(max_length=10)

  1. 药物信息表
class Drug(models.Model):
    chinese_name = models.CharField(max_length=20)
    english_name = models.CharField(max_length=30)
    approved_num = models.CharField(max_length=30)
    detail = models.TextField()

  1. 药物-癌症表
class Drugcaner(models.Model):
    drug = models.ForeignKey(Drug, on_delete=models.CASCADE)
    tumor = models.ForeignKey(Tumor, on_delete=models.CACADE)
   
  1. 用药信息表
class Drugusage(models.Model):
    drug = models.ForeignKey(Drug, on_delete=models.CASCADE)
    tumor = models.ForeignKey(Tumor, on_delete=models.CACADE)
    snv = models.ForeignKey(Snv, on_delete=models.CASCADE)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容