Django app摘自数据模型

时间:2015-04-20 12:39:29

标签: python django django-models abstract

我目前正在开发一个小型数据“报告”应用程序。其背后的想法是能够从特定位置(无论是平面文件还是远程数据库)导入数据,并根据特定的“维度”报告该数据(例如销售)(例如,销售额)按区域产品客户)。首先,当我构建它时,我创建了一个“销售”模型,其中这些维度为其他模型的FK(区域模型,产品模型,客户模型)。该应用程序的报告方面只是该表上的一堆请求以图表结尾 - 这很好。

现在假设我想将此应用程序部署/扩展到多个用户;每个用户都有自己的数据集,例如用户A想要报告销售(按地区,产品和客户),而用户B想要报告生产量(按产品,按工厂和按月)。处理这个问题的最佳方法是什么?有没有办法从基础数据集中提取数据模型?

我已经快速了解了各种解决方案,例如:

  1. Django动态模型

    这可能是一个有趣的方法,但看着它的代码 似乎只能添加/删除字段 动态 - 我需要的是动态添加/删除模型。

  2. NoSQL或任何非结构化数据库后端

    这可能是我所看到的一个选项,但我没有 经验很难以承担。

  3. 任何EAV类型的数据模型

    与(1)相同我认为这可能有用 字段,而不是整个表格。

  4. 使用JSONField进行序列化来存储数据

  5. 我很难看到如何使用Django来实现这一目标(在某些时候我觉得我(错误地)尝试重新构建DBMS)。

    感谢任何帮助!

    干杯, 的J -

1 个答案:

答案 0 :(得分: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模型中选择尽可能多的条件,因为他们希望查看数据。