2015-05-10 3 views
0

Мне нужно создать веб-сервис для хранения данных, и я хочу сделать это на Python/Django. Он имеет только 2 элемента во внешнем интерфейсе - таблицу и диаграмму. Таким образом, в основном вывод в шаблоне является полностью стандартным для всех просмотров во всех приложениях. У меня есть 2 класса, которые компилируют данные для вывода для этих 2 элементов в JSON, который отправляется в ReactJS во фронте.Какова наилучшая практика в базе метаданных для Django?

Теперь у меня есть несколько приложений, и единственная разница между ними - это модели. Даже CRUD-виды и URL-адреса практически одинаковы для всех них. Поэтому я собираюсь использовать некоторую базу метаданных для хранения всех данных в унифицированном виде. Как и сохранение всех значений в 3 таблицах - для строк, int и float.

Вещь, которую я боюсь, - это производительность. Если все мои метаданные, такие как типы объектов, категории и т. Д., Будут храниться в одной таблице, я думаю, что черт получить хотя бы простое значение из 4 или 5 запросов с использованием Django ORM и общей модели для всех вещей в система.

С другой стороны, есть возможность, что я не могу создавать новые модели программно «на лету». После того, как он находится в производстве, изменений кода не должно быть, из-за контрольной суммы файлов проекта.

Мне нужен совет, как справиться с этой ситуацией. Я подумал о чем-то вроде метаданных Drupal, но Drupal создает новые таблицы «на лету», и им не нужны модели в коде для работы с ними. Есть ли способ сделать это так, как в Django?

ответ

0

Судя по вашим требованиям, вам, вероятно, придется использовать общие отношения: https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/, но это не будет конец света, если все метаданные будут сохранены в одной таблице. Допустим, у вас есть 3 разных строки моделей, ints, floats. Вам нужно создать MetaData модель, которая действует как хранилище ключей значения:

class MetaData(models.Model): 
    key = models.CharField(max_length=256, db_index=True) 
    value = models.CharField(max_length=256) 

    # Generic relationship to an arbitrary object 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

Тогда в простом случае вы можете использовать сохранить значения в эту таблицу так: х = Float.objects.get (рк = 1) v = MetaData (content_object = е, ключ = "float_calculation_precision", значение = "6") v.save()

Если вы знаете, прежде чем руки, что вы собираетесь использовать только те 3 модели вы можете добавьте обратное поле GenericRelation на каждую из этих моделей.

class Floats(models.Model): 
    metadata = generic.GenericRelation(MetaData) 

class Ints(models.Model): 
    metadata = generic.GenericRelation(MetaData) 

class Strings(models.Model): 
    metadata = generic.GenericRelation(MetaData) 

, а затем вы можете получить доступ к метаданным так:

Floats.metadata.all() 

, чтобы получить все объекты метаданных или:

f = Floats.objects.get(pk=1) 

f.metadata.all() 

, чтобы получить все объекты метаданных для конкретного объекта:

Вы также можете использовать пакет https://github.com/rafaelsierra/django-metadata, где вы можете сделать что-то вроде этого:

mymodel.metadata['something'] = 'some value' 
mymodel.metadata['something'] 
+0

Это очень интересно, но вы написали о реализации. Зная мои разрешенные модели, я могу сделать mdb (метаданные), даже используя ORM с простыми моделями и фильтрами. То, что меня беспокоит, и то, что я прошу, на самом деле является самой схемой mdb. Способ хранения всех моделей, которые могут понадобиться единым образом с использованием таблиц mdb, и хранения/управления их данными. И производительность решений, которые вы могли бы порекомендовать. Может быть, какие-либо ссылки или книги по этому вопросу? – Tosh

Смежные вопросы