2017-03-09 2 views
0

Ich bekomme ein Problem mit Django Chartit aus meiner Datei views.py, weil er meine Tabelle nicht findet. Diese Tabelle existiert jedoch in meiner MySQL Database.Tabelle existiert nicht mit Django Chartit roher Abfrage

Ich verwende dieses Modul, um einige Grafiken in meiner Django-Website anzuzeigen, und es ist das erste Mal, dass ich es benutze.

Ich habe eine Tabelle, die Person in meiner Identity Anwendung wie diese benannt:

class Person(models.Model): 

    title = models.CharField(max_length=12,choices=TITLE_CHOICES, verbose_name='Civilité') 
    young_girl_lastname = models.CharField(max_length=30, verbose_name='Nom de jeune fille', blank=True) 
    lastname = models.CharField(max_length=30, verbose_name='Nom de famille') 
    firstname = models.CharField(max_length=30, verbose_name='Prénom(s)') 
    sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe') 
    birthday = models.DateField(verbose_name='Date de naissance') 
    birthcity = models.CharField(max_length=30, verbose_name='Ville de naissance') 
    birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance') 
    ..... 

In meiner MySQL-Datenbank, ich habe dies:

mysql> show tables ; 
+-------------------------------------+ 
| Tables_in_DatasystemsEC    | 
+-------------------------------------+ 
| BirthCertificate_birthcertificate | 
| Configurations_theme    | 
| Identity_monthlyweatherbycity  | 
| Identity_person      | 
| Mairie_mairie      | 
| Recensement_attestation_recensement | 
| auth_group       | 
| auth_group_permissions    | 
| auth_permission      | 
| auth_user       | 
| auth_user_groups     | 
| auth_user_user_permissions   | 
| django_admin_log     | 
| django_content_type     | 
| django_migrations     | 
| django_session      | 
| log_userprofile      | 
+-------------------------------------+ 

Sie haben Identity_person als Tabelle.

Aus meiner Sicht definiert ich eine neue Funktion, um einige Statistiken Grafiken anzuzeigen:

def Chartview(request) : 

    #Step 1: Create a DataPool with the data we want to retrieve. 
    ds = \ 
     DataPool(
      series= 
      [{'options': { 
       'source': Person.objects.raw(
        "SELECT birthcountry, COUNT(birthcountry) as nombre FROM Person GROUP BY birthcountry") 
      }, 
       'terms': [ 
       'birthcountry', 
       'nombre']} 
      ]) 

    #Step 2: Create the Chart object 
    cht = Chart(
      datasource = ds, 
      series_options = 
       [{'options':{ 
        'type': 'column', 
        'stacking': False}, 
       'terms':{ 
        'birthcountry': [ 
        'nombre'] 
        }}], 
      chart_options = 
       {'title': { 
        'text': 'Nombre de naissances par pays'}, 
       'xAxis': { 
        'title': { 
         'text': 'Pays de naissance'}}}) 

    return render(request, 'statistics.html',{'birthcountrychart': cht}) 

Aber ich diesen Fehler:

(1146, "Table 'DatasystemsEC.Person' doesn't exist") 

Ich verstehe nicht, was ich habe ersetzen: Person.objects.raw. Ich habe versucht Identity_person.objects.raw, aber es funktioniert nicht.

Danke von vorab

EDIT:

ich einen anderen Weg gefunden, um meine Abfrage mit Django Aggregation dank @ e4c5 und es funktioniert ziemlich gut zu machen:

Person.objects.values('birthcountry').annotate(nombre = Count('birthcountry'))} 

Antwort

1

Ich denke, Sie sollten Ihre SQL schreiben als:

'source': Person.objects.raw(
       "SELECT birthcountry, COUNT(birthcountry) as nombre FROM Identity_person GROUP BY birthcountry") 
     }, 
+0

Danke! Sie haben mein Problem gelöst, auch wenn ich einen weiteren Fehler bekomme: 'Rohabfrage muss den Primärschlüssel enthalten' – Deadpool

1

Bei MySQL-Tabellennamen wird bei den meisten Installationen zwischen Groß- und Kleinschreibung unterschieden. Die Standard-django Tabelle Nomenklatur ist appname_tablename in Kleinbuchstaben, so sollten Sie Ihre idealerweise die folgenden in Ihrem Modell haben:

class Meta: 
    db_table = 'Identity_person' 

Dann Ihre RAW-Abfrage aber auch die richtige Tabellenname sollte

SELECT birthcountry, COUNT(birthcountry) as nombre FROM Identity_person GROUP BY birthcountry 

würde ich argumentieren Sie, dass Sie hier eine Django-Aggregation anstelle einer reinen Abfrage verwenden sollten.

+0

Danke :) Warum sollte ich Django Aggregation verwenden? Nicht einfach 'count',' group by' sql Funktionen mit Django zu verwenden:/ – Deadpool

+0

Ja, das ist eine der größten Schwächen von Django. – e4c5

Verwandte Themen