2017-03-09 42 views
0

我从我的views.py文件中找到Django Chartit的问题,因为他没有找到我的表。但是这个表格存在于我的MySQL Database中。表不存在与Django Chartit原始查询

我使用这个模块为了在我的Django网站显示一些图形,这是我第一次使用它。

我有它在我的Identity应用命名Person这样的表:

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') 
    ..... 

在我的MySQL数据库,我有这样的:

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      | 
+-------------------------------------+ 

你有Identity_person如表。

在我看来,我为了显示一些统计图形定义了一个新功能:

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}) 

但我得到这个错误:

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

我不要什么,我都明白取代:Person.objects.raw。 我试过Identity_person.objects.raw但它不起作用。

谢谢您提前

编辑:

我找到了另一种方式来让我的Django的聚合感谢查询@ e4c5和它的作品相当不错:

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

回答

1

我想你应该把你的SQL写成:

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

谢谢!你解决了我的问题,即使我得到另一个错误:'原始查询必须包含主键' – Deadpool

1

Mysql表名在大多数安装中都区分大小写。该标准的Django表命名为全部小写appname_tablename所以你最好有在你的模型如下:

class Meta: 
    db_table = 'Identity_person' 

那么你的原始查询也应该有正确的表名

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

不过,我想争辩说你应该在这里使用django聚合而不是原始查询。

+0

谢谢:)为什么我应该使用Django聚合?不容易使用'count','group by'sql函数和Django:/ – Deadpool

+0

是的,这是django最大的缺点之一。 – e4c5