Джанго много-много рекурсивных отношений - PullRequest
2 голосов
/ 16 августа 2011

Я не очень хорошо разбираюсь в базах данных, так что извините, если я не очень хорошо это описываю ...

У меня есть база данных Oracle, которая описывает каталог алгоритмов.Есть две таблицы алгоритмов и xref_alg.

Алгоритмы могут иметь алгоритмы для родителей и детей.Alg_Xref содержит эти отношения с двумя внешними ключами - xref_alg и xref_parent.

Это модели Django, которые у меня так далеко от команды inspectdb

class Algorithms(models.Model):
    alg_id = models.AutoField(primary_key=True)
    alg_name = models.CharField(max_length=100, blank=True)
    alg_description = models.CharField(max_length=1000, blank=True)
    alg_tags = models.CharField(max_length=100, blank=True)
    alg_status = models.CharField(max_length=1, blank=True)
    ...
    class Meta:
        db_table = u'algorithms'

class AlgXref(models.Model):
    xref_alg = models.ForeignKey(Algorithms, related_name='algxref_alg' ,null=True, blank=True)
    xref_parent = models.ForeignKey(Algorithms, related_name='algxref_parent', null=True, blank=True)
    class Meta:
        db_table = u'alg_xref'

При попытке запросить AlgXref я сталкиваюсь с этим:

DatabaseError: ORA-00904: "ALG_XREF"."ID": invalid identifier

Так что, похоже, ошибка в том, что он ищет идентификатор первичного ключа, которого нет в таблице ... Я мог бы создать его, но он кажется немного бессмысленным.Есть ли способ обойти это?Или поменять мои модели?

РЕДАКТИРОВАТЬ: Таким образом, после небольшого поиска кажется, что Django требует модель, чтобы иметь первичный ключ.Жизнь слишком коротка, поэтому только что добавили первичный ключ.Повлияет ли это на производительность?

1 Ответ

2 голосов
/ 16 августа 2011

В настоящее время это ограничение ORM, предоставляемое Django.Каждая модель должна иметь одно поле, помеченное как primary_key=True, если его нет, каркас автоматически создает AutoField с именем id.

Однако, пока мы говорим, над этим работаюткак часть Google Summer of Code этого года и, надеюсь, будет в Джанго к концу этого года.Сейчас вы можете попробовать использовать форк Django, доступный по адресу https://github.com/koniiiik/django, который содержит реализацию (которая еще не завершена, но должна быть достаточной для ваших целей).

Что касается того, есть лиВыгода или нет, это зависит.Это, безусловно, делает базу данных более пригодной для повторного использования и уменьшает головную боль, если вы просто добавляете автоматически увеличивающийся столбец id в каждую таблицу.Влияние на производительность не должно быть слишком высоким, единственное, что вы можете заметить, это то, что если у вас есть таблица типа «многие ко многим», такая как эта, содержащая только два столбца ForeignKey, добавление третьего столбца увеличит ее размер на половину.,Это, однако, не имеет значения, если вы не храните миллиарды строк в этой таблице.

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