Прежде всего, я знаю, что на этот вопрос, возможно, уже был дан ответ, но есть две причины, почему я открываю еще один вопрос: один, очевидно, я борюсь с Синтаксис 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. Должен ли я еще больше изменить дизайн базы данных, или я просто пропустил какую-то другую вещь здесь?
«один один препарат может иметь много различных имен» в вас, например, что таблица имеет название основной и который один имеет другие имена. –
На ваш вопрос о '__str__' был дан ответ в ответах, но ваш проект базы данных имеет серьезные проблемы. Первое из них - вы сохраняете собственное имя вместе с непатентованным (общим); поскольку один родословный может иметь много проприетарных имен, это означает, что вы будете хранить одно и то же имя во многих местах, излишне занимая пространство и делая его кошмаром, если вам когда-нибудь понадобится его исправить. Тема надлежащего дизайна БД слишком широка для комментария или даже ответа, я бы рекомендовал сначала прочитать книгу о дизайне реляционных баз данных. – rafalmp
@ François Основное имя будет «non_proprietary_name». Имена псевдонимов были бы «проприетарным именем» (s). – theCed7