Django:链接两个表

时间:2016-07-24 21:00:03

标签: python sql django database

首先,我知道这个问题可能已经得到了回答,但我还有两个原因可以解决另一个问题:一个问题,显然是我的问题。苦苦于Django语法。其次,也许更重要的是,我不太确定我的数据库设置是否在这一点上有意义。所以,请耐心等待。

我在医院工作,而我每天的一个问题是,一种单一的药物通常会有很多不同的名字。所以,我认为练习一些Django是一项很好的任务。

基本上我想要两个数据库:一个只是简单地链接毒品和#34;昵称"它的实际名称。另一个将实际名称与一些其他信息相关联,这与维基页面的内容相似。

到目前为止,我提出了什么:

 $('.crop-image').on('click', function () {
    var img = $('.file-preview-image');
    var canvas = $("<canvas>")[0];
    canvas.width = img[0].naturalWidth;
    canvas.height = img[0].naturalHeight;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img[0], 0, 0);
    var url = canvas.toDataURL();
    img.attr("src", url).Jcrop()
 });

所以,我可以添加一个新的&#34; medsearch对象&#34;正好。但是,在添加&#34;类别&#34;在medwiki,我得到(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$ 。据推测,因为医学研究中有多个关键词?因此我怀疑&#34; FroeignKey&#34;不适合这个应用程序,我知道还有其他方法可以链接Django中的数据库。但是,我不知道选择哪一个以及如何正确实施它。

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

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

__str__ returned non-string (type medsearch)

现在,我可以将不同的类别和不同的专有名称归因于一种药物。到目前为止哪个很好用。

当我知道专有的&#34;昵称&#34;时,查找非专有名称也是如此。

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

但是,当我知道non_proprietary_name时,我还想显示所有的private_names。我是否需要进一步更改数据库设计,还是我在这里缺少其他一些东西?

2 个答案:

答案 0 :(得分:2)

这样可行:

return self.proprietary_name.proprietary_name

但那确实没有意义!

主要问题是您已将外键调用medsearchproprietary_name

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

以下情况会更好:

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

答案 1 :(得分:1)

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

return str(self.proprietary_name)

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

return self.proprietary_name.proprietary_name