2015-04-20 2 views
0

В настоящее время я работаю над небольшим заявлением о представлении данных. Идея заключается в том, чтобы иметь возможность импортировать данные из определенного места (будь то плоский файл или удаленную базу данных) и сообщать об этих данных (например, Sales), следуя определенным «измерениям» (например, Продажи по региона, по продукт, покупатель). Сначала, когда я его построил, я создал модель «Sales» с такими размерами как FK для других моделей (модель Region, модель продукта, модель Customer). Аспектом отчетности приложения является просто куча запросов на эту таблицу, заканчивающихся в диаграммах, - это отлично работает.Django аннотация абз. От модели данных

Теперь предположим, что я хочу развернуть/масштабировать это приложение для нескольких пользователей; каждый пользователь будет иметь свой собственный набор данных, например. Пользователь A хочет сообщить о продажах (по регионам, продукту и клиенту), в то время как пользователь B хочет сообщить о объемах производства (по продукту, по заводам и по месяцам). Какой был бы лучший способ справиться с этим? Есть ли способ сделать абстрактную модель данных из базовых наборов данных?

Я имел быстрый взгляд на различные решения, такие как:

  1. Джанго динамических моделей

    Это может быть интересный подход, однако, глядя на код, он кажется, что это возможно только добавлять/удалять поля динамически --- мне нужно будет добавлять/удалять модели динамически.

  2. NoSQL или любая неструктурированная бэкенд базы данных

    Это может быть вариантом из того, что я видел, но у меня нет опыта с теми, так что трудно предположить.

  3. Любого типа EAV модель данные

    То же, что для (1) Я нахожусь под впечатлением, что это может работать для полеев, а не для целых таблиц.

  4. Сериализация с использованием JSONField для хранения данных

Я изо всех сил, чтобы увидеть, как я мог бы принять это вперед, используя Django (в какой-то момент я чувствую, что я (ошибочно) пытается построить СУБД сначала).

Любая помощь приветствуется!

Приветствия, J-

+0

Не можете ли вы поместить все потенциальные критерии отчетности в свою модель (регион, продукт, клиент, продукт, завод, месяц), а затем иметь разные представления для создания разных отчетов? –

+0

Это может быть решение, но как я могу управлять тем фактом, что некоторые пользователи будут рассматривать продажи по регионам и продуктам, в то время как другие будут рассматривать продажи по продукту и клиенту? Это, на мой взгляд, было бы двумя разными моделями с разными полями 'models.ForeignKey()', не так ли? – jlibioul

+0

Например, вы можете иметь представление 'sales_by_region' и другое представление' sales_by_product'. Затем добавьте профиль пользователя (http://stackoverflow.com/a/965883/1623026) с полем 'preferred_sales_view'. Тогда у вас может быть кнопка, которую пользователь нажимает «Открыть продажи» и динамически устанавливает целевой объект на основе значения «preferred_sales_view». Либо он направляется в 'sales_by_region', либо' sales_by_product'. –

ответ

0

Например, что-то вроде:

models.py:

class Sale(models.Model): 
    seller = models.ForeignKey(Vendor) 
    buyer = models.ForeignKey(Customer) 
    product = models.ForeignKey(Product) 
    region = models.ForeignKey(Region) 

и views.py:

def sales_by_product(request, product_id): 
    product_sales = Sale.objects.filter(product=product_id) 
    return render_to_response('sales_report.html', {'sales':product_sales,}, context_instance=RequestContext(request))) 

def sales_by_region(request, region_id): 
    regional_sales = Sale.objects.filter(region=region_id) 
    return render_to_response('sales_report.html', {'sales':regional_sales,}, context_instance=RequestContext(request))) 

def all_sales(request): 
    return render_to_response('sales_report.html', {'sales':Sale.objects.all(),}, context_instance=RequestContext(request))) 

И если вы хотите, в models.py, что-то вроде е:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    preferred_report = models.CharField(max_length=1, choices=(('P','Product'),('R','Region'),)) 
    region = models.ForeignKey(Region) 
    favorite_product = models.ForeignKey(Product) 

Тогда в views.py:

def user_sales_report(request): 
    profile = request.user.get_profile() 
    if profile.preferred_report == "P": 
     HttpResponseRedirct('/sales/product/%i/' % profile.favorite_product_id) 
    elif profile.preferred_report == "R": 
     HttpResponseRedirct('/sales/region/%i/' % profile.region_id) 
    else: 
     HttpResponseRedirect('/sales/all/') 

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

+0

Привет, Данос, спасибо за это. Это именно то место, где я был, но я не могу найти ответ на мой вопрос: как я могу сделать этот отрывок из основных данных? Фактически, вы жестко указываете «Продажи», тогда как я не знаю заранее, какие базовые данные (или размеры) будут. Я скорее ищу что-то вроде 'class Cube (models.Model): dimensions = ListField()'. Смотрите, что я имею в виду? – jlibioul

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