【问题标题】:Django db.connection.cursor.fetchone() returns unexpected resultDjango db.connection.cursor.fetchone() 返回意外结果
【发布时间】:2012-09-30 14:53:12
【问题描述】:

我的 models.py 中有这个管理器

class ItemManager(models.Manager):
 def get_fee(self):
 from django.db import connection
    cursor = connection.cursor()
    cursor.execute("""
        SELECT fee
        FROM item
        WHERE itemID = %d AND item.type = %d 
        """, [self.myItemID, self.myItemType])
    fee = cursor.fetchone()
    return fee

和类

Sample(models.Model):
sampleID = models.AutoField(primary_key=True)
itemID = models.ForeignKey(Item)
item.type  = models.ForeignKey(Item)
    ...

def save(self, *args, **kwargs):
    is_new = self.pk is None
    super(Sample, self).save(*args, **kwargs)
    if is_new:
        cd.amount = MonthlyFeeManager() 
        cd.save()

然后它会产生错误:

Cannot convert <myapp.models.ItemManager object at 0xa6f07ec> to Decimal

一般来说,我想在管理器中执行一个 RAW SQL 查询并使用它从查询中获取结果。我尝试搜索,但大多数返回是元组,而不是值。

【问题讨论】:

  • 您在滥用管理器。事实上,所有这些代码看起来都很奇怪。这是您的实际代码还是通用示例?关系看起来不正确,属性名称也不正确
  • 这只是一个例子。你可以忽略我上面的代码。我只是希望 cd.amount 在执行 sql 查询时从不同的表中获取一个值(或者可能有另一种方式)。
  • 是的,但如果您的代码示例甚至无法远程反映您在做什么,我们将无法帮助您。您可以简单地在保存方法中进行查询并将值分配给amount。但这种方法都是您的应用程序的猜测。

标签: django rawsql


【解决方案1】:

这不是你使用经理的方式。即使使用完全正常的类实例,您的尝试也不会给您想要的:您需要实例化它并在实例上调用 get_fee()

使用管理器,您不需要实例化它,因为这已经作为模型上的 objects 属性为您完成了。但是还是需要调用相关的方法:

cd.amount = Sample.objects.get_fee()

但是,这仍然不起作用。那是因为您引用了 self.myItemIdself.myItemType,它们在 Manager 对象中不存在。这使我得出结论,您根本不需要 Manager 对象:您只需要标准模型方法。而且也不需要原始 SQL:您的代码可以使用普通模型查询语法完美地轻松表达。

(我无法准确地向您展示它的外观,因为您示例中的 ForeignKeys 没有任何意义,并且不清楚 fee 应该来自哪里。)

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多