我目前正在开发一个小型数据“报告”应用程序。其背后的想法是能够从特定位置(无论是平面文件还是远程数据库)导入数据,并根据特定的“维度”报告该数据(例如销售)(例如,销售额)按区域,产品,客户)。首先,当我构建它时,我创建了一个“销售”模型,其中这些维度为其他模型的FK(区域模型,产品模型,客户模型)。该应用程序的报告方面只是该表上的一堆请求以图表结尾 - 这很好。
现在假设我想将此应用程序部署/扩展到多个用户;每个用户都有自己的数据集,例如用户A想要报告销售(按地区,产品和客户),而用户B想要报告生产量(按产品,按工厂和按月)。处理这个问题的最佳方法是什么?有没有办法从基础数据集中提取数据模型?
我已经快速了解了各种解决方案,例如:
Django动态模型
这可能是一个有趣的方法,但看着它的代码 似乎只能添加/删除字段 动态 - 我需要的是动态添加/删除模型。
NoSQL或任何非结构化数据库后端
这可能是我所看到的一个选项,但我没有 经验很难以承担。
任何EAV类型的数据模型
与(1)相同我认为这可能有用 字段,而不是整个表格。
使用JSONField进行序列化来存储数据
我很难看到如何使用Django来实现这一目标(在某些时候我觉得我(错误地)尝试重新构建DBMS)。
感谢任何帮助!
干杯, 的J -
答案 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
模型中选择尽可能多的条件,因为他们希望查看数据。