首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Django的多对多数据库设计

基于Django的多对多数据库设计
EN

Stack Overflow用户
提问于 2016-07-28 01:06:33
回答 2查看 63关注 0票数 0

通常,一种药物可能会有很多“昵称”,这会让人感到困惑。因此,我正在尝试构建一个小的Django应用程序来帮助我解决这个问题。

它应该做的是将药物的实际名称(non_proprietary_name)指向它的“昵称”(proprietary_name),反之亦然。

例如,“阿司匹林”和"ASS“是”乙酰水杨酸“的proprietary_name。

为了让它更复杂一点,我决定添加一个小的Wiki页面和类别(而且,一种药物可以分为许多不同的类别)。

不幸的是,我对数据库设计不是很熟悉,所以我需要一点帮助。

到目前为止,我得到的是:

代码语言:javascript
复制
from django.db import models

# Create your models here.

class Proprietary_name(models.Model):
    proprietary_name = models.CharField(max_length = 100, unique = True) #nick name

    def __str__(self):
        return self.proprietary_name

class Category(models.Model):
    category = models.CharField(max_length = 100, unique = True)

    def __str__(self):
        return self.category

class Mediwiki(models.Model):
    proprietary_name = models.ManyToManyField(Proprietary_name)
    non_proprietary_name = models.CharField(max_length = 100, unique = True) # actual name
    category = models.ManyToManyField(Category)
    wiki_page = models.TextField()

    def __str__(self):
        return self.non_proprietary_name

~

所以,如果我得到了proprietary_name,我就可以和non_proprietary_name联系起来:

代码语言:javascript
复制
>>> Mediwiki.objects.get(proprietary_name__proprietary_name='Aspirin')
<Mediwiki: acetylsalicylic acid>

然而,当我进入专有的non_proprietary_names时,我很难获得所有的all。这是我的数据库的问题,还是我遗漏了其他东西?

编辑:

基于评论的新models.py:

代码语言:javascript
复制
from django.db import models

# Create your models here.

class Category(models.Model):
    category = models.CharField(max_length = 100, unique = True)

    def __str__(self):
        return self.category

class Mediwiki(models.Model):
    non_proprietary_name = models.CharField(max_length = 100, unique = True)
    category = models.ManyToManyField(Category)
    wiki_page = models.TextField()

    def __str__(self):
        return self.non_proprietary_name

class ProprietaryName(models.Model):
    proprietary_name = models.CharField(max_length = 100, unique = True)
    non_proprietary_name = models.ForeignKey(Mediwiki)

    def __str__(self):
        return self.proprietary_name

所以,它起作用了!但我不太确定为什么..。这是最好的方法吗?另外,类别又是什么呢?它们是否也应该更改为外键?

代码语言:javascript
复制
>>> Mediwiki.objects.get(proprietaryname__proprietary_name="Aspirin")
<Mediwiki: acetylsalicylic acid>
>>>

>>> ProprietaryName.objects.get(proprietary_name="Aspirin").non_proprietary_name
<Mediwiki: acetylsalicylic acid> # Works also, what's preferable? 

>>>ProprietaryName.objects.filter(non_proprietary_name__non_proprietary_name="acetylsalicylic acid")
        [<ProprietaryName: Aspirin>, <ProprietaryName: ASS>]
        >>>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-28 01:33:18

可以有许多专有名称,但不能将相同的专有名称分配给多个非专有(通用)药物,因此您需要将您的关系从多对多更改为一对多(nb.在类名中使用CamelCase,而不是下划线):

代码语言:javascript
复制
class Mediwiki(models.Model):
    non_proprietary_name = models.CharField(max_length = 100, unique = True) # actual name
    category = models.ManyToManyField(Category)
    wiki_page = models.TextField()

class ProprietaryName(models.Model):
    proprietary_name = models.CharField(max_length = 100, unique = True) #nick name
    non_proprietary_name = models.ForeignKey(Mediawiki)

然后您可以使用Mediawikiproprietaryname_set属性和ProprietaryNamemediawiki属性来查找非专有名称的所有专有药物。有关这方面的更多信息,请参阅documentation

票数 1
EN

Stack Overflow用户

发布于 2016-07-28 01:24:42

首先,您的模型名Mediwiki并不简单,因为每个条目只是记录了一个Drug的所有信息。因此,将其更改为Drug会更有意义。

在您当前的设计中,您使用的是m2m字段,这表明一个proprietary_name可以用于多个药物。如果您想在进入proprietary_name时返回所有Drug non_proprietary_names,只需执行以下操作:

代码语言:javascript
复制
Drug.objects.filter(proprietary_name__proprietary_name='Aspirin') \
            .values_list('non_proprietary_name', flat=True).distinct()

查看django文档中关于values_list的内容。

但是,如果一个proprietary_name只能描述一种药物,您应该在模型Proprietary_name上将Drug设置为外键,以指示一对多关系:

代码语言:javascript
复制
class Proprietary_name(models.Model):
    proprietary_name = models.CharField(max_length=100, unique=True)
    drug = models.ForeignKey(Drug)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38619218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档