通过builder的Django复杂查询
Django complex query through builder
我已经有一段时间无法使用 ORM 进行复杂的查询了。我知道这是可能的,所以我会原谅帮助。
class Game(models.Model):
no matter
class Competition(models.Model):
game = models.ForeignKey(to='game.Game', verbose_name=_('game'), related_name='competitions',
on_delete=models.PROTECT)
class User(models.Mode):
no matter
class Balance(models.Model):
user = models.OneToOneField(to=User, on_delete=models.CASCADE, primary_key=True)
class BalanceTransaction(models.Model):
TYPES = (
(TYPE_COMMISSION, _('commission')),
}
competition = models.ForeignKey(to='competition.Competition', verbose_name=_('competition'), related_name='transactions', on_delete=models.CASCADE, null=True, blank=True)
balance = models.ForeignKey(to=Balance, on_delete=models.CASCADE, related_name='transactions')
amount = models.DecimalField(_('Transaction amount'), default='0.0', max_digits=28, decimal_places=18,
null=False, blank=False)
type = models.CharField(_('type'), max_length=10, default=TYPE_DEPOSIT, choices=TYPES, null=False, blank=False
我必须 return 一个游戏查询集,其中每个元素都有一个额外的 "income" 字段,用于存储类型为 "commission"[ 的该游戏的所有交易总和=12=]
Game.objects.filter(publisher__owner=self.request.user.pk).annotate(
income=Sum(Case(
When(
Q(publisher__owner__balance__transactions__type=BalanceTransaction.TYPE_COMMISSION),
then=???,
)
))
这种方式好像不行,只能用子查询了,目前还没成功
我认为您不需要子查询或大小写,只需一个标准过滤器。
Game.objects.filter(publisher__owner=self.request.user.pk).filter(
publisher__owner__balance__transactions__type=BalanceTransaction.TYPE_COMMISSION
).annotate(
income=Sum('publisher__owner__balance__transactions__amount)
)
请参阅 order of annotate and filter clauses 以了解有关其工作原理的解释。
我已经有一段时间无法使用 ORM 进行复杂的查询了。我知道这是可能的,所以我会原谅帮助。
class Game(models.Model):
no matter
class Competition(models.Model):
game = models.ForeignKey(to='game.Game', verbose_name=_('game'), related_name='competitions',
on_delete=models.PROTECT)
class User(models.Mode):
no matter
class Balance(models.Model):
user = models.OneToOneField(to=User, on_delete=models.CASCADE, primary_key=True)
class BalanceTransaction(models.Model):
TYPES = (
(TYPE_COMMISSION, _('commission')),
}
competition = models.ForeignKey(to='competition.Competition', verbose_name=_('competition'), related_name='transactions', on_delete=models.CASCADE, null=True, blank=True)
balance = models.ForeignKey(to=Balance, on_delete=models.CASCADE, related_name='transactions')
amount = models.DecimalField(_('Transaction amount'), default='0.0', max_digits=28, decimal_places=18,
null=False, blank=False)
type = models.CharField(_('type'), max_length=10, default=TYPE_DEPOSIT, choices=TYPES, null=False, blank=False
我必须 return 一个游戏查询集,其中每个元素都有一个额外的 "income" 字段,用于存储类型为 "commission"[ 的该游戏的所有交易总和=12=]
Game.objects.filter(publisher__owner=self.request.user.pk).annotate(
income=Sum(Case(
When(
Q(publisher__owner__balance__transactions__type=BalanceTransaction.TYPE_COMMISSION),
then=???,
)
))
这种方式好像不行,只能用子查询了,目前还没成功
我认为您不需要子查询或大小写,只需一个标准过滤器。
Game.objects.filter(publisher__owner=self.request.user.pk).filter(
publisher__owner__balance__transactions__type=BalanceTransaction.TYPE_COMMISSION
).annotate(
income=Sum('publisher__owner__balance__transactions__amount)
)
请参阅 order of annotate and filter clauses 以了解有关其工作原理的解释。