2016-04-21 1 views
1

У меня есть следующие моделиДжанго QuerySet к списку dicts без дублирования

Модели

class Player(models.Model): 
    name = models.CharField(max_length=50) 
    DOB = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return "%s" % self.name 


class League(models.Model): 
    name = models.CharField(max_length=50) 
    country = models.CharField(max_length=50) 
    player = models.ForeignKey(Manager, related_name='players') 


    def __unicode__(self): 
     return "%s" % self.name 

Просмотров

def exportdata(request): 
    q = League.objects.all().select_related("player") 

    content = [] 
    for record in q: 
     info = { 
      'players': [record.player.name], 
      'leaguename' : record.name, 
      'country': record.country 
     } 
     content.append(info) 

    return HttpResponse(json.dumps(content)) 

Response

[{ 
    "players": ["Roman"], 
    "leaguename": "La liga", 
    "country" : "Spain" 
}, 
{ 
    "players": ["Anthon"], 
    "leaguename": "Premier", 
    "country" : "UK" 
}, 
{ 
    "players": ["Xavi"], 
    "leaguename": "La liga", 
    "country": "Spain" 
}, 
{ 
    "players": ["Ronaldo"], 
    "leaguename": "Premier ", 
    "country": "UK" 
}, 
{ 
    "players": ["Zessi"], 
    "leaguename": "Championship ", 
    "country": "Spain" 
} 
] 

Мне нужен список игроков, играющих в конкретной лиге (без дублирования) в формате JSON, поэтому я могу разобрать результат из углового. Как я могу достичь этого? Ожидаемый ответ в следующем формате:

[ 
    { 
     "players": [{"id" : 12, "name": "Roman"}, {"id" : 150, "name": "Xavi"}], 
     "leaguename": "La liga (Spain)" 
    }, 
    { 
     "players": [{"id" : 98, "name": "Ronaldo"}, {"id" : 9, "name": "Anthon"}], 
     "leaguename": "Premier (UK)" 
    }, 
    { 
     "players": [{"id" : 19, "name": "Zessi"}], 
     "leaguename": "Championship (Spain)" 
    } 
] 

Что я пытался

def exportdata(request): 
    leagues = League.objects.all().select_related("player") 

    content = [] 
    players = [] 

    for league in leagues: 
     # league doesn't exists so append it 
     if not any(item['leaguename'] == league.name for item in content): 
      content.append({"leaguename": league.name, 
         "players": players.append({"id": league.player.id, "name": league.player.name})}) 
     else: 
      # league already exists so don't append 
      # players doesn't exists so append 
      content.append({"leaguename": league.name, 
         "players": players.append({"id": league.player.id, "name": league.player.name})}) 


    return HttpResponse(json.dumps(content)) 
+0

Почему бы не просто вернуть 'q'? ваш цикл for - вещь, изменяющая формат – Sayse

ответ

0
def view(request): 
    leagues = League.objects.select_related('player') 
    results = [] 
    for league in leagues: 
     results.append({'leaguename': league.name, 
         'players': [{'id': player.id, 'name': player.name} 
            for player in league.players.all()}) 
+0

, она должна только добавлять игрока (id, name), если ** leaguename ** уже существует! – MysticCodes

+0

'Лига в лигах: results.append ({'leagueename': league.name, 'players': [{'id': league.player.id, 'name': league.player.name}]) ' – MysticCodes

+0

Вы протестировали его? Это создаст диктовку для каждой лиги с указанием их игроков внутри них. Поскольку мы итерируем объекты Лиги, они уникальны. В чем проблема? –