Страницы

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

пятница, 7 июня 2019 г.

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

Доброго времени суток. Помогите, пожалуйста, со следующим вопросом. Необходимо описать модель дерева в 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 Что, собственно, логично. Как же быть? Спасибо.


Ответ

Рекомендую Вам использовать 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.

Удаление пробелов и переводов строк

Для того что б вырезать все пробелы и переводы строк, как с начала, так и с конца, + убирать двойные пробелы, написал регулярку: $opis =~ s/^\s+|^(
?
)+|\s+$|(
?
)+$//g; $opis =~ s/\s+/ /g; Локально все работает, как только запускаю на сервере, работать не хочет. Вернее оно удаляет вообще все переводы строк, даже те, что есть в середине текста. Почему?


Ответ

\s в регулярном выражении означает и перевод каретки в том числе, поэтому в середине строки исчезают переводы. используйте \h $opis =~ s/^\s+|\s+$//g; $opis =~ s/\h+/ /g;

Реализация представления в Django ORM

Здравствуйте. Как можно реализовать вьюху (представление в mysql) в Django ORM. Например, есть класс Группы, нам надо вытащить студентов (группы:'студенты', 'преподаватели') class People: name = models.CharField(u'Название', max_length=150) describe = models.CharField(u"Описание", max_length=150 ) Т.е. нам надо создать представление для того, чтобы потом связывать с этой моделью с полем id_stident class Group_stud: id_student = ForeignKey(Student) Вот модель Student'a нам нужна! Как сделать не знаю, в mysql можно было бы создать представление с фильтром и все было бы гуд, а у нас ORM, так не пойдет. Можно как нибудь такое реализовать?


Ответ

Конечно не то, что хотел, но этим можно обойтись. Реализовал с помощью class Manager подсказал @rnd_d class StudentManager(models.Manager): def get_query_set(self): return super(StudentManager, self).get_query_set().filter(groups__name='Students') # в User есть поле groups и идет фильтр по полю name
class User(User): students = StudentManager() Выходные данные >>> from main.models import User >>> User.students.all() []

Использование шаблонной системы Django

Доброго времени суток! Подскажите, пожалуйста, возможно ли использовать (если да, то как) в своем cgi-скрипте шаблонную систему Django. Сам фреймворк установлен.


Ответ

Да. Можете. Причём где угодно: >>> from django.template import Template, Context >>> from django.conf import settings >>> settings.configure() >>> t = Template(u'Меня зовут {{ my_name }}.') >>> c = Context({'my_name': 'SkyFox'}) >>> t.render(c) u'Меня зовут SkyFox.' В официальной документации это тоже описано: https://docs.djangoproject.com/en/dev/ref/templates/api/#configuring-the-template-system-in-standalone-mode, но, правда, сложно найти.

Хостинги для публикации кода

Есть два понятия:
сниппет — кусок кода, который можно использовать повторно, система контроля версий — система, используемая для того, чтобы несколько программистов работали над одним проектом и использовали один репозиторий.
Вопрос в следующем. Я пробовал пользоваться Github, но это несколько затратно ввиду моих нужд. Нужно, чтобы на некоем сайте можно было начать проект, была примитивная возможность создавать папки, сливать туда файлы с кодом, и этот же код, просматривать онлайн. Сливать именно через браузер, а не через систему контроля версий (часто работаю на разных компьютерах, а устанавливать и настраивать git, желания нет).
Сниппеты не катят, потому что это не файлы. А искать, если проект состоит более чем из одного файлы радости не доставляет. Плюс бывают файлы с моделями, а их таким образом уже не зальешь.
Заранее спасибо за дельные советы и ссылки.


Ответ

Обычно в таких ситуациях (когда система контроля версий - слишком тяжеловесно) используют Dropbox UPD Несколько извращенный вариант, но просмотр кода он-лайн есть, да еще и с примочками: CodeRemarks

Как лучше сделать динамическую ссылку на SQLite

У SQLite есть версии для x86 и x64. Компьютеры и Windows у нас тоже есть разные. Нужно, чтобы всё работало и собиралось на компьютерах разных разработчиков с разными CPU. Пока что у меня есть только такое решение: не ссылаться из сборок на SQLite, а загружать сборки динамически в зависимости от CPU, а для вызова свойств и методов использовать тип dynamic. Но это как-то криво выглядит.


Ответ

Any CPU не катит по описаным автором причинам. Я использовал кусок кода в самом файле проекта (*.csproj), который в зависимости от архитектуры CPU добавляет ссылку нужной разрядности. Проект найти не могу, но что то типа такого: False ..\..\Lib\SQLite\x86\System.Data.SQLite.dll То есть по умолчанию добавляется например ссылка на х86 и небольшое условие, которое обновит сссылку на другую, если необходимо. В примере только наоборот.

Размер кучи в С++

Можно ли в С++ ограничивать размеры используемой кучи?


Ответ

Интересный вопрос, никогда не сталкивался с этим. А вообще чисто в C++ нету такой функции, для этого используются ОС вызовы. Как сделать под Visual Studio. http://msdn.microsoft.com/ru-ru/library/f90ybzkh.aspx Установка данного параметра компоновщика в среде разработки Visual Studio Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Установка свойств проекта Visual C++. Щелкните папку Компоновщик. Выберите страницу свойств Система. Измените значение свойства Выделить память для кучи. Под Линукс mallinfo, malloc_stats или команда pmap из терминала