Хотите добиться функции поиска на странице администратора django для нескольких таблиц
В настоящее время я работаю над страницей администратора django 2.0.2. У меня есть три таблицы: "метаболиты", "ген" и "реакции". Структура каждого класса определяется следующим образом:
class Genes(models.Model):
id = models.CharField(primary_key=True, max_length=255)
name = models.CharField(max_length=255, blank=True, null=True)
notes = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'Genes'
class Metabolites(models.Model):
id = models.CharField(primary_key=True, max_length=255)
name = models.CharField(max_length=255, blank=True, null=True)
compartment = models.CharField(max_length=255, blank=True, null=True)
charge = models.CharField(max_length=255, blank=True, null=True)
formula = models.CharField(max_length=255, blank=True, null=True)
notes = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'Metabolites'
class Reactions(models.Model):
id = models.CharField(max_length=255, primary_key=True)
name = models.CharField(max_length=255, blank=True, null=True)
metabolites = models.TextField(blank=True, null=True)
lower_bound = models.CharField(max_length=255, blank=True, null=True)
upper_bound = models.CharField(max_length=255, blank=True, null=True)
gene_reaction_rule = models.TextField(blank=True, null=True)
subsystem = models.CharField(max_length=255, blank=True, null=True)
notes = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'Reactions'
Как видите, в класс "реакция" также включен компонент "метаболиты". Обычно в реакции участвуют более двух метаболитов. Я хочу создать поле поиска на странице администратора (а не на странице каждого класса), и когда я набираю идентификатор реакции, результат поиска может отображать реакцию и все вовлеченные метаболиты, а когда я печатаю в метаболитах результат поиска может отображать информацию об этом метаболите и все реакции, в которых участвует этот метаболит.
Это возможно? Может кто-нибудь сказать мне, как это сделать?
Спасибо за помощь мне!
1 ответ
РЕДАКТИРОВАТЬ:
Это описывает "старую школу" способ достижения этого. Похоже, что это пример использования многих полей Django. Я не столкнулся с этой потребностью в моем проекте; так что я еще не изучил многие возможности в django. Я рекомендую прочитать документацию по django, чтобы узнать, как использовать много-много полей.
Описанный здесь способ будет выполнять желаемые соединения в данных. Тем не менее, я подозреваю, что администратор django будет проще и проще в настройке, используя поле "многие ко многим".
конец редактирования
Вы хотите сделать другую модель для metabolites_in_reaction
он содержит только собственный первичный ключ, внешний ключ к реакции и внешний ключ к метаболитам.
class ReactionMetabolites(models.Model):
reaction = models.ForeignKey(Reactions, on_delete=models.CASCADE)
metabolite = models.ForeignKey(Metabolites, on_delete=models.CASCADE)
Поле "многие ко многим" также может быть уместным здесь; Я еще не разобрался во многих областях.
Изменить 2:
После внесения этих изменений в ваши модели вам нужно будет выполнить и применить миграции, чтобы применить изменения к вашей базе данных.
python manage.py makemigrations
python manage.py migrate