首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:链接两个表

Django:链接两个表
EN

Stack Overflow用户
提问于 2016-07-25 05:00:03
回答 2查看 402关注 0票数 0

首先,我意识到这个问题可能已经得到了回答,但有两个原因让我开始提出另一个问题:一个很明显,我正在努力使用Django语法。其次,也许更重要的是,我不太确定我的数据库设置在这一点上是否有意义。所以,请耐心听我说。

我在一家医院工作,我每天都会遇到的一个问题是,一种药物通常会有很多不同的名称。所以,我认为这是一个很好的任务来练习一些Django。

基本上,我想要两个数据库:一个简单地将药物的“昵称”与它的实际名称联系起来。另一种是将实际名称链接到一些附加信息,类似于维基页面的内容。

到目前为止,我想出的是:

代码语言:javascript
复制
(django)django@ip:~/medwiki$ cat medsearch/models.py
from django.db import models

# Create your models here.

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

    def __str__(self):
        return self.non_proprietary_name

class medwiki(models.Model):
    proprietary_name = models.ForeignKey('medisearch', on_delete=models.CASCADE)
    cetegory = models.CharField(max_length = 255)
    #wiki = models.TextField() etc. 

    def __str__(self):
        return self.proprietary_name
(django)django@ip-:~/medwiki$

所以,我可以添加一个新的"medsearch对象“。然而,当我在medwiki添加“类别”时,我得到了__str__ returned non-string (type medsearch)。大概是因为medsearch中有不止一个键吧?因此,我怀疑"FroeignKey“不适合这个应用程序,我知道在Django中还有其他方法可以链接数据库。然而,我不知道该选择哪一个,以及如何正确地实现它。

希望,你们中的一些人有一些想法?

编辑:这是我到目前为止想出的:

代码语言:javascript
复制
class Proprietary_name(models.Model):
    proprietary_name = models.CharField(max_length = 100, unique = True)

    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)
    category = models.ManyToManyField(Category)
    wiki_page = models.TextField()

    def __str__(self):
        return self.non_proprietary_name

现在我可以将不同的类别和不同的proprietary_names归因于一种药物。到目前为止,它工作得很好。

当我知道专有的“昵称”时,查找非专有名称也是如此。

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

但是,当我知道proprietary_names时,我也想显示所有的non_proprietary_name。我是否必须进一步更改数据库设计,或者我只是在这里遗漏了一些其他东西?

EN

回答 2

Stack Overflow用户

发布于 2016-07-25 05:14:07

这将会起作用:

代码语言:javascript
复制
return self.proprietary_name.proprietary_name

但这并不是真的有意义!

主要问题是您调用了medsearch的外键proprietary_name

第二个问题只是一个常规问题。在Python (和许多编程语言)中,类必须以大写字母开头。

下面的代码会更好:

代码语言:javascript
复制
class MedSearch(models.Model):
    proprietary_name = models.CharField(max_length=100, unique=True)
    non_proprietary_name = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return self.non_proprietary_name

class MedWiki(models.Model):
    med_search = models.ForeignKey('MedSearch', on_delete=models.CASCADE, related_name='wikis')
    cetegory = models.CharField(max_length = 255)
    #wiki = models.TextField() etc. 

    def __str__(self):
        return self.med_serach.proprietary_name
票数 2
EN

Stack Overflow用户

发布于 2016-07-25 05:13:18

正如您所注意到的,medwiki上的proprietary_name字段是一个ForeignKey。您不能直接从__str__方法返回该值,因为它需要返回一个字符串。在返回之前,您需要将该值转换为字符串:或者使用medsearch实例的默认字符串表示:

代码语言:javascript
复制
return str(self.proprietary_name)

或者选择要返回的特定字符串字段:

代码语言:javascript
复制
return self.proprietary_name.proprietary_name
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38556735

复制
相关文章

相似问题

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