Django – 根据模型字段生成excel报告

该应用程序是build立在Django /angular 。 我想生成一个基于模型的Excel报告,它是用户select的字段。 你可以在下面findsearch界面。 我在django有4个模型。 教练球员参与 俱乐部的外部参照(一对多关系)。 个人Django模型将作为selectinput和模型字段

models.py

from datetime import datetime from django.db import models class Club(models.Model): name = models.CharField(max_length=200) estd = models.IntegerField() address = models.CharField(max_length=200) def __unicode__(self): return "%s" % self.name class Coach(models.Model): fname = models.CharField(max_length=80) lname = models.CharField(max_length=80) age = models.IntegerField() fk = models.ForeignKey(Club, related_name='coaches') def __unicode__(self): return "%s" % self.fname class Player(models.Model): fname = models.CharField(max_length=80) lname = models.CharField(max_length=80) country = models.CharField(max_length=42) fk = models.ForeignKey(Club, related_name='players') def __unicode__(self): return "%s" % self.fname class Participation(models.Model): league = models.CharField(max_length=80) startdate = models.DateTimeField() fk = models.ForeignKey(Club, related_name='participations') def __unicode__(self): return "%s" % self.league 

search用户界面(select下拉菜单)

 ##### ###### ####### ############# Club Coach Player Participation ##### ###### ####### ############# name fname fname league estd lname lname startdate address age country 

用例

 - User have to select at least one field from the Club dropdown. - User can select one or more fields from Coach, Player and Participation dropdown. 

HTML

 <select class="form-control" data-ng-model="selected" data-ng-options="item.tablefield for item in coach" ng-click="addField()"></select> <select class="form-control" data-ng-model="selected" data-ng-options="item.tablefield for item in player" ng-click="addField()"></select> <select class="form-control" data-ng-model="selected" data-ng-options="item.tablefield for item in participation" ng-click="addField()"></select> <button type="button" class="btn btn-default" ng-click="report()">Generate report</button> 

Angular JS

  $scope.club = [{ 'tablename': 'Club', 'tablefield': 'name' }, { 'tablename': 'Coach', 'tablefield': 'estd' }, { 'tablename': 'Coach', 'tablefield': 'address' } ]; $scope.coach = [{ 'tablename': 'Coach', 'tablefield': 'fname' }, { 'tablename': 'Coach', 'tablefield': 'lname' }, { 'tablename': 'Coach', 'tablefield': 'age' } ]; $scope.player = [{ 'tablename': 'Player', 'tablefield': 'fname' }, { 'tablename': 'Player', 'tablefield': 'lname' }, { 'tablename': 'Player', 'tablefield': 'country' } ]; And Similar for participation $scope.queryfields = []; // add fields $scope.addField = function(){ var found = $scope.queryfields.some(function (el) { return el.value === $scope.selected.tablefield; }); if (!found) { var searchkey = $scope.selected.tablename, searchvalue = $scope.selected.tablefield; $scope.queryfields.push({ key: searchkey, value: searchvalue }) } else{ console.log('field already exist'); } }; // SEARCH $scope.report = function() { if($scope.queryfields.length > 1){ // post search fields data $http.post('/api/gamify/advancesearch/', $scope.queryfields) .success(function (response) { $scope.queryset = response; }) .error(function (data, status, headers, config) { console.log('error'); }); } }; 

selectinput中的选定字段将发送到Django视图以进行查询和结果连接。 发送到Django视图的数据看起来像这样

 [{u'value': u'name', u'key': u'Club'}, {u'value': u'fname', u'key': u'Coach'}, {u'value': u'lname', u'key': u'Coach'}, {u'value': u'fname', u'key': u'Player'}, {u'value': u'league', u'key': u'Participation'}] 

查看

 def report(request): qfields = json.loads(request.body) print query """ [{u'value': u'name', u'key': u'Club'}, {u'value': u'fname', u'key': u'Coach'}, {u'value': u'lname', u'key': u'Coach'}, {u'value': u'fname', u'key': u'Player'}, {u'value': u'league', u'key': u'Participation'}]""" # TO-DO # Get all records of Club (field: name) # Get all records of Coach (fields: fname, lname) which is reference of Club. # Get all records of Player (field: fname) which is reference of Club. # Get all records of Participation (field: league) which is reference of club. # Export to excel # Response json object records = Player.objects.order_by('id').values('id', *qfields) return HttpResponse(json.dumps(list(records))) 

这就是json响应的样子。 JSON响应将被转换为excel文件

 { "datarow1":{ "Club":[ { "club.name":"FC Bar" }, { "coach":{ "coach.fname":[ "Hari", "Shyam", "Parbe" ] } }, { "player":[ { "player.fname":[ "King", "Leo", "Singh" ] }, { "player.lname":[ "Dev", "Fin" ] } ] }, { "participation":[ { "participation.league":[ "la liga", "UEFA" ] } ] } ] }, "datarow2":{ "Club":[ { "club.name":"FC TU" }, { "coach":{ "coach.fname":[ "Xavi", "Hola", "Them" ] } }, { "player":[ { "player.fname":[ "Sab", "Hi", "Suz" ] }, { "player.lname":[ "Messi", "Aura" ] } ] }, { "participation":[ { "participation.league":[ "Italian", "Premier" ] } ] } ] }, } 

帮帮我

我如何获得俱乐部和外键数据(教练,球员,参与)的所有logging基于选定的模型领域相关 ? 报告的例子如上所示。

任何帮助和反馈的赞赏。

你还没有提供你的模型的代码。

通常,您可以使用QueryManager的非常有用的方法.values().values_list()来获取某些字段的列表。 你可以参考__ like club__name的值的关系。

我想在你的出口中的一行是指一个玩家。 所以,你必须从玩家模型开始build立关系。

例:

 Player.objects.order_by('lname').values('lname', 'coach__fname', 'coach__lname', 'club__name', 'club__league') 

ManyToMany领域更加困难。 他们可能需要在QueryManager上进行聚合或extra select调用。

试试这个代码

 def report(request): query = json.loads(request.body) print query """ [{u'value': u'name', u'key': u'Club'}, {u'value': u'fname', u'key': u'Coach'}, {u'value': u'lname', u'key': u'Coach'}, {u'value': u'fname', u'key': u'Player'}, {u'value': u'league', u'key': u'Participation'}]""" clubs = Club.objects.all() result = {} for index, club in enumerate(clubs): coach_fname = club.coach_set.all().values_list('fname', flat=True) player_fname = club.player_set.all().values_list('fname', flat=True) player_lname = club.player_set.all().values_list('lname', flat=True) participation_leage = club.participation_set.all().values_list('league') out_put = [] club_details = {"club.name": club.name } coach_details = {"coach":{"coach.fname": list(coach_fname) }} player_details = { "player":[ { "player.fname": list(player_fname)},{ "player.lname": list(player_lname)}]} participation_details = { "participation":[ { "participation.league": list(participation_leage)}]} out_put.append(club_details) out_put.append(coach_details) out_put.append(player_details) out_put.append(participation_details) result.update({ ['datarow{}'.format(index)]['Club']: out_put}) return HttpResponse(json.dumps(result)) 

事实上,有一个实用工具可以让你从django-queryset-csv的d​​jango-queryset-csv中将所有的function(从链接到查找字段)从Django查询集中导出csv数据。

用法exapmle:

 from djqscsv import render_to_csv_response def csv_view(request): qs = Player.objects.order_by('lname').values('lname', 'coach__fname', 'coach__lname', 'club__name', 'club__league') return render_to_csv_response(qs) 

检查azavea博客的更多使用示例。 我希望你能find这个有用的。