Страницы

Поиск по вопросам

четверг, 19 марта 2020 г.

Описание “дерева” Oracle в Django models.py

#oracle #python #дерево #django


Доброго времени суток. Помогите, пожалуйста, со следующим вопросом.
Необходимо описать модель дерева в Django. Используемая БД - Oracle.
Описываю так:
class TelDivisions(models.Model):
    parent = models.ForeignKey('self')
    name = models.CharField(max_length=50, blank=True)
    class Meta:
        db_table = u'tel_divisions'

но таким образом parent ссылается сам на себя. Каким образом сделать так, чтобы он
ссылался на столбец id данной таблицы?
Думал может получиться вот так:
class TelDivisions(models.Model):
    parent = models.ForeignKey(TelDivisions, db_column='id', blank=True)
    name = models.CharField(max_length=50, blank=True)
    class Meta:
        db_table = u'tel_divisions'

но команда python manage.py validate выявила:
parent = models.ForeignKey(TelDivisions, db_column='id', blank=True)
NameError: name 'TelDivisions' is not defined

Что, собственно, логично. Как же быть?
Спасибо.    


Ответы

Ответ 1



Рекомендую Вам использовать django-mtpp. Она была создана как раз для отображения древовидных структур в реляционной модели. А что касается вашего вопроса: parent = models.ForeignKey('self', db_column='id', blank=True) И всё должно заработать. Ссылаться надо на самого себя через self. Данный пример описан в django docs. И ещё одно. Если не укажите null = True, то не сможете создать ни одного корновего экземпляра (т.е. такого, у которого нет родителя). Итого: parent = models.ForeignKey('self', db_column='id', blank=True, null = True) db_column='id' можно не указывать, т.к. он и так будет ссылаться по умолчанию на ключевое поле таблицы, т.е. id.

Ответ 2



Правильно делаешь в первом варианте, в базе будет столбик parent_id типа integer. Гляньте статейку и комментарии почитайте, там есть полезные ссылочки, сам на днях разбирался с этим вопросом: деревья в джанго-шаблонах Если дерево многоуровневое, то mtpp все рекомендуют, но если один уровень вложенности как у меня, то я без дополнительных библиотек обошелся.

Комментариев нет:

Отправить комментарий