2016-06-18 1 views
2

Je suis en train d'écrire cette requête SQL brute,Réécrire SQL brute comme Django requête

info_model = list(InfoModel.objects.raw('SELECT *, 
       max(date), 
       count(postid) AS freq,  
       count(DISTINCT author) AS contributors FROM   
       crudapp_infomodel GROUP BY topicid ORDER BY date DESC')) 

comme une requête de django. La tentative suivante ne fonctionne pas car je ne peux pas obtenir les champs associés pour 'author' et 'post'.

info_model = InfoModel.objects.values('topic') 
       .annotate(max=Max('date'), 
        freq=Count('postid'),    
        contributors=Count('author', 
        distinct=True)) 
        .order_by('-max') 

Avec SQL brute je peux utiliser SELECT * mais comment puis-je faire l'équivalent avec la requête Django?

Le modèle est,

class InfoModel(models.Model): 
    topicid = models.IntegerField(default=0) 
    postid = models.IntegerField(default=0) 
    author = models.CharField(max_length=30) 
    post = models.CharField(max_length=30) 
    date = models.DateTimeField('date published') 

Je ne posterai déjà ce problème ici Django Using order_by with .annotate() and getting related field

+1

Je suppose que vous utilisez MySQL puisque votre requête brute ne fonctionnera pas sur PostGres. La raison en est que vous commandez avec un champ qui n'est pas le groupe par. Votre requête brute est étrange, s'il vous plaît fournir une entrée et une sortie attendue –

+0

Ok, je vois ce que vous voulez dire, donc je dois utiliser .order_by ('- max'). Cela ordonne les données correctement. Vous pouvez réellement voir les données d'origine si vous suivez le lien au bas de la publication. –

+0

J'utilise sqlite. –

Répondre

3

Je suppose que vous voulez commander la date maximale si:

InfoModel.objects.values('topic') 
       .annotate(
        max=Max('date'), freq=Count('postid'),    
        contributors=Count('author', distinct=True)) 
       .order_by('max') 
+0

Que order_by ('- max') fonctionne correctement, merci. Mais je ne peux pas montrer les autres champs liés comme je peux avec le SQL (ou peut-être c'est mySQL, je connais à peine la différence). –

+0

J'ai écrit une solution ici http://stackoverflow.com/questions/37908049/get-related-column-on-annotate-data-django/37911943#37911943 –

0

La vue ci-dessous des amalgames deux requêtes pour résoudre le problème,

def info(request): 
    info_model = InfoModel.objects.values('topic') 
       .annotate(max=Max('date'), 
       freq=Count('postid'), 
       contributors=Count('author', distinct=True)) 
       .order_by('-max') 

    info2 = InfoModel.objects.all() 

    columnlist = [] 
    for item in info2: 
     columnlist.append([item]) 

    for item in info_model: 
     for i in range(len(columnlist)): 
      if item['max'] == columnlist[i][0].date: 
       item['author'] = columnlist[i][0].author 
       item['post'] = columnlist[i][0].post 

    return render(request, 'info.html', {'info_model': info_model})