Вывод результатов запроса MySQL в оболочке Django - PullRequest
2 голосов
/ 03 июня 2010

У меня есть следующая модель Django, которая извлекает 3 записи из базы данных. Приведенный ниже класс представляет модель в приложении Django, которое я создаю. Я понимаю, что параметры, принятые функцией 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 и выполняю следующие инструкции:

>>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 Ответ

3 голосов
/ 03 июня 2010

Метод Victims.create_hotspots не имеет оператора return. Что вы ожидали, что он вернется?

Кроме того, Victims.create_hotspots не выполняет save() для сохранения экземпляра жертвы.

Кстати, использование необработанного SQL-кода внутри объекта моделей часто является плохой идеей. Вам следует подумать о том, чтобы сделать вашу "poi_table" правильной частью модели Django и использовать правильный дизайн реляционной базы данных, чтобы избежать запросов к одному классу при попытке создать экземпляр другого.

Если вы пытаетесь создать «постоянные агрегатные» объекты, вам следует подумать о том, чтобы сделать что-то другое.

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

Это распутает ваши две модели, позволяя вам писать более простые, менее запутанные модели, используя простую обработку Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...