Джанго внешние ключи - PullRequest
       23

Джанго внешние ключи

2 голосов
/ 08 февраля 2010

Я новичок в Django, и у меня есть следующее отношение в модели

class Name_Mapping(models.Model):
 AccessionID = models.ForeignKey(('Feature', 'Protein', 'Substrate'), primary_key = True)
 Element_Name = models.CharField(max_length = 40)

Это вызывает ошибку:

AssertionError: ForeignKey ((«Feature», «Protein», «Substrate»)) недопустим. Первый параметр ForeignKey должен быть либо моделью, либо именем модели, либо строкой 'self'

Не могли бы вы помочь мне с синтаксисом, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2010

Синтаксис для чего? Вы не объяснили, что вы пытаетесь сделать с этим. Код только показывает нам, что вы пытались, и, как вы знаете, это не сработало. Что это должно было сделать? Похоже, вы хотите, чтобы между типами Feature, Protein и Substrate существовали отношения типа «многие ко многим». (У вас также есть эти модели? Это не ясно.)

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

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

1 голос
/ 08 февраля 2010

Я согласен с JCD. Вам, вероятно, нужно использовать общий внешний ключ .

Поскольку вы спрашивали о синтаксисе, вы, возможно, захотите изменить соглашения об именах классов и переменных, чтобы они соответствовали стилю, который вы найдете в большинстве кодов Python. См. PEP8 для получения более подробной информации, но два больших элемента должны использовать CapWords для имен классов и строчные буквы (с экономным использованием подчеркиваний для удобства чтения) для переменных.

Вот возможная переписанная модель NameMapping с использованием универсального внешнего ключа и соглашения об именах PEP8:

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class NameMapping(models.Model):
    name = models.CharField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    accession_object = generic.GenericForeignKey('content_type', 'object_id')
1 голос
/ 08 февраля 2010

Посмотрите отношения многие-к-одному и ForeignKey .

Я думаю, у вас неверное представление о том, что делает ForeignKey. Но без объяснения того, чего вы хотите достичь, трудно помочь.

Из вашего кода я бы предположил, что вы хотите, чтобы AccessionID содержал одно из значений 'Feature', 'Protein', 'Substrate'. Но если вы пометите его как primary_key, это будет означать, что в вашей таблице будет максимум три строки, поскольку первичный ключ уникален.

Обновление:

После прочтения других комментариев, да, вам, вероятно, придется использовать Общие отношения . У вас не может быть одного ForeignKey, указывающего на разные таблицы, как вы пытались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...