在Django shell中输出MySQL查询结果

时间:2010-06-03 19:24:00

标签: python mysql django

我有以下Django模型,它从数据库中检索3条记录。下面的类代表我正在构建的Django应用程序中的Model。我意识到create_hotspots函数所采用的参数未被使用。为了解释我的问题,我刚刚简化了之前代码的样子。

from django.db import models
from django.db import connection, transaction
import math
import MySQLdb

class Victims(models.Model):

    def __init__(self):
        self.results=[]
    def create_hotspots(self,radius,latitude,longitude):

        self.radius=str(radius)
        self.latitude=str(latitude)
        self.longitude=str(longitude)

        db=MySQLdb.connect (host = "localhost", user = "root",passwd = "pass",db = "test")
        cursor = db.cursor ()
        cursor.execute("""SELECT * FROM poi_table""")
        self.results=cursor.fetchall()
        cursor.close ()
        db.close ()
    def __unicode__(self):
        return self.results

现在,假设我打开Django shell并执行以下指令:

>>from PyLayar.layer.models import Victims
C:\Python26\lib\site-packages\MySQLdb\__init__.py:34: DeprecationWarning: the sets module is deprecated
  from sets import ImmutableSet
>>> v=Victims()
>>> v.create_hotspots(1000, 42.3931955679, -72.5289916992)
>>> Victims.objects.all()
[]

我的问题是为什么Victims.objects.all()指令没有返回结果。 SQL查询返回3个结果,results变量存储生成的元组。

1 个答案:

答案 0 :(得分:3)

Victims.create_hotspots方法没有return语句。你期望它返回什么?

此外,Victims.create_hotspots没有save()来保存受害者实例。

BTW,在模型对象中使用原始SQL通常是一个非常糟糕的主意。你应该考虑让你的“poi_table”成为Django模型的一个适当部分,并使用适当的关系数据库设计来避免在尝试创建另一个类的实例时查询一个类。

如果您正在尝试创建“持久聚合”对象,则应考虑做一些不同的事情。

v= Victim.objects.create( radius, lat, lon, Poi.objects.all())
v.save()

这将解开你的两个模型,允许你使用简单的Django处理编写更简单,纠缠度更低的模型。