SELECT *, SUM(cardtype.price - cardtype.cost) AS profit
FROM user
LEFT OUTER JOIN card ON ( user.id = card.buyer_id)
LEFT OUTER JOIN cardtype ON ( card.cardtype_id = cardtype.id)
GROUP BY user.id
ORDER BY profit DESC
我嘗試這樣做:如何在django模型中執行這個sql?
User.objects.extra(select=dict(profit='SUM(cardtype.price-cardtype.cost)')).annotate(sum=Sum('card__cardtype__price')).order_by('-profit')
但Django的自動添加SUM(cardtype.price)
到GROUP BY
條款,以及SQL 不運行。
這可以在沒有原始SQL的情況下完成嗎?
提供模型,別提這些中國字:)
class User(models.Model):
class Meta:
verbose_name = "用戶"
verbose_name_plural = "用戶"
ordering = ['-regtime']
user_status= (
("normal", "正常"),
("deregistered", "註銷"),
("locked", "鎖定"),
)
name = models.CharField("姓名", max_length=20, db_index=True)
spec_class = models.ForeignKey(SpecClass, verbose_name="專業班級")
idcard = models.CharField("身份證號", max_length=18)
mobileno = models.CharField("手機號", max_length=11)
password = models.CharField("密碼", max_length=50) # plain
address = models.CharField("住址", max_length=100)
comment = models.TextField("備註")
certserial = models.CharField("客戶證書序列號", max_length=100)
regtime = models.DateTimeField("註冊時間", default=datetime.datetime.now)
lastpaytime = models.DateTimeField("上次付款時間", default=datetime.datetime.now)
credit = models.FloatField("信用額度", default=100)
money = models.FloatField("餘額", default=0)
use_password = models.BooleanField("使用密碼")
use_fetion = models.BooleanField("接收飛信提示")
status = models.CharField("賬戶狀態", choices = user_status, default="normal", max_length=20, db_index=True)
def __unicode__(self):
return self.name
class CardType(models.Model):
class Meta:
verbose_name = "點卡類型"
verbose_name_plural = "點卡類型"
ordering = ['name']
name = models.CharField("類型名稱", max_length=20, db_index=True)
note = models.CharField("說明", max_length=100)
offcial = models.BooleanField("官方卡", default=True)
available = models.BooleanField("可用", default=True, db_index=True)
payurl = models.CharField("充值地址", max_length=200)
price = models.FloatField("價格")
cost = models.FloatField("進貨價格")
def __unicode__(self):
return u"%s(%.2f元%s)" % (self.name, self.price, u", 平臺卡" if not self.offcial else "")
def profit(self):
return self.price - self.cost
profit.short_description = "利潤"
class Card(models.Model):
class Meta:
verbose_name = "點卡"
verbose_name_plural = "點卡"
ordering = ['-createtime']
card_status = (
("instock", "未上架"),
("available", "可用"),
("sold", "已購買"),
("invalid", "作廢"),
("returned", "退卡"), # sell to the same person !
("reselled", "退卡重新售出"),
)
cardtype = models.ForeignKey(CardType, verbose_name="點卡類型")
serial = models.CharField("卡號", max_length=40)
password = models.CharField("卡密", max_length=20)
status = models.CharField("狀態", choices = card_status, default="instock", max_length=20, db_index=True)
createtime = models.DateTimeField("入庫時間")
buytime = models.DateTimeField("購買時間", blank=True, null=True)
buyer = models.ForeignKey(User, blank=True, null=True, verbose_name="買家")
def __unicode__(self):
return u'%s[%s]' % (self.cardtype.name, self.serial)
是的,你可以用django使用原始的sql查詢。 – 2010-09-29 09:07:11
@anand:OP明確表示_可以這樣做**沒有**原始SQL?_ – 2010-09-29 09:11:25