Django db.connection.cursor.fetchone()返回意外结果
我的模特里有个经理Django db.connection.cursor.fetchone()返回意外结果,django,rawsql,Django,Rawsql,我的模特里有个经理 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 """,
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
无法转换为十进制
通常,我希望在管理器中执行原始SQL查询,并使用它从查询中获得结果。我试图搜索,但大多数返回是元组,而不是值。这不是管理器的使用方式。即使使用一个完全正常的类实例,您的尝试也无法满足您的需要:您需要实例化它并在实例上调用
get\u fee()
对于管理器,您不需要实例化它,因为这已经作为模型上的objects
属性为您完成了。但是您仍然需要调用相关的方法:
cd.amount = Sample.objects.get_fee()
然而,这仍然行不通。这是因为您引用了管理器对象上不存在的self.myItemId
和self.myItemType
。这让我得出结论,您根本不需要Manager对象:您只需要一个标准的模型方法。而且也不需要原始SQL:您的代码完全可以使用正常的模型查询语法轻松地表达出来
(我不能告诉你它到底是什么样子,因为你的例子中的外键没有任何意义,而且不清楚
费用应该从哪里来。)你误用了经理。事实上,所有这些代码看起来都很奇怪。这是您的实际代码还是通用示例?关系看起来不正确,属性名称也不正确。这只是一个示例。你可以忽略我上面的代码。我只是想让cd.amount在执行sql查询时从另一个表中获取一个值(或者可能有另一种方法)。是的,但是如果您的代码示例甚至不能远程反映您正在做的事情,我们就帮不了您。您只需在save方法中执行查询,然后将值分配给amount
。但是这种方法对于您的应用程序来说都是猜测。