2016-07-24 3 views
0

Прежде всего, я знаю, что на этот вопрос, возможно, уже был дан ответ, но есть две причины, почему я открываю еще один вопрос: один, очевидно, я борюсь с Синтаксис Django. Во-вторых, и, что еще важнее, я не совсем уверен, имеет ли смысл настройка базы данных на данный момент. Поэтому, пожалуйста, несите меня.Django: Связывание двух таблиц

Я работаю в больнице, и один из моих ежедневных отрогов заключается в том, что, как правило, у одного единственного наркотика может быть много разных имен. Итак, я думал, что это будет хорошая задача, чтобы практиковать Django.

В основном я хочу две базы данных: один, который просто связывает наркотики «никнейм» с его фактическим именем. И еще один, который связывает фактическое имя с некоторой дополнительной информацией, что-то похожее на страницу вики.

То, что я придумал до сих пор:

(django)[email protected]:~/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)[email protected]:~/medwiki$ 

Таким образом, я могу добавить новый «объект» medsearch просто отлично. Однако при добавлении «Категории» в medwiki я получаю __str__ returned non-string (type medsearch). Предположительно, потому что в medsearch есть более одного ключа? Поэтому я подозреваю, что «FroeignKey» не подходит для этого приложения, и я знаю, что существуют другие способы связывания баз данных в Django. Однако я не знаю, какой из них выбрать и как правильно его реализовать.

Надеюсь, у некоторых из вас есть идеи?

EDIT: Вот что я придумал до сих пор:

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 

Теперь я могу приписать различные categorys и различные proprietary_names к одному препарату. Что до сих пор замечательно.

Так что, глядя на не-proprietary_name, когда я знаю проприетарное «ник».

>>> Mediwiki.objects.get(proprietary_name__proprietary_name="Aspirin") 
<Mediwiki: acetylsalicylic acid> 
>>> 

Однако я хотел бы также, чтобы отобразить все proprietary_names, когда я знаю non_proprietary_name. Должен ли я еще больше изменить дизайн базы данных, или я просто пропустил какую-то другую вещь здесь?

+0

«один один препарат может иметь много различных имен» в вас, например, что таблица имеет название основной и который один имеет другие имена. –

+0

На ваш вопрос о '__str__' был дан ответ в ответах, но ваш проект базы данных имеет серьезные проблемы. Первое из них - вы сохраняете собственное имя вместе с непатентованным (общим); поскольку один родословный может иметь много проприетарных имен, это означает, что вы будете хранить одно и то же имя во многих местах, излишне занимая пространство и делая его кошмаром, если вам когда-нибудь понадобится его исправить. Тема надлежащего дизайна БД слишком широка для комментария или даже ответа, я бы рекомендовал сначала прочитать книгу о дизайне реляционных баз данных. – rafalmp

+0

@ François Основное имя будет «non_proprietary_name». Имена псевдонимов были бы «проприетарным именем» (s). – theCed7

ответ

1

Как вы заметили, поле proprietary_name на medwiki является иностранным. Вы не можете вернуть это значение непосредственно из метода __str__, потому что ему нужно вернуть строку. Вы должны преобразовать это значение в строку перед возвратом его: либо использовать строку по умолчанию представление о в medsearch Например:

return str(self.proprietary_name) 

или выбрать определенное строковое поле для возврата:

return self.proprietary_name.proprietary_name 
2

Это будет работать :

return self.proprietary_name.proprietary_name 

Но это на самом деле не имеет смысла!


Основной проблемой является то, что вы назвали внешний ключ к medsearch, proprietary_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 
Смежные вопросы