Django 如何使用来自不同查询的分组值连接一个表?

Django 如何使用来自不同查询的分组值连接一个表?,django,django-models,Django,Django Models,我有一个这样的模型: class Subscription(models.Model): visable_name = models.CharField(max_length=50, unique=True) recipe_name = models.CharField(max_length=50) website_url = models.URLField() class User(models.Model): username = models.Char

我有一个这样的模型:

class Subscription(models.Model):
    visable_name = models.CharField(max_length=50, unique=True)

    recipe_name = models.CharField(max_length=50)
    website_url = models.URLField()


class User(models.Model):
    username = models.CharField(max_length=50)


class UserSubs(models.Model):
    subscription = models.ForeignKey(Subscription, to_field='visable_name')
    user = models.ForeignKey(User, to_field='username')
rank = UserSubs.objects.values('subscription').
                        annotate(total=Count('user')).
                        order_by('-total')`
我想做一个简单的排名,所以我想出了这样的办法:

class Subscription(models.Model):
    visable_name = models.CharField(max_length=50, unique=True)

    recipe_name = models.CharField(max_length=50)
    website_url = models.URLField()


class User(models.Model):
    username = models.CharField(max_length=50)


class UserSubs(models.Model):
    subscription = models.ForeignKey(Subscription, to_field='visable_name')
    user = models.ForeignKey(User, to_field='username')
rank = UserSubs.objects.values('subscription').
                        annotate(total=Count('user')).
                        order_by('-total')`
什么使:

>> rank
[
   {'total': 3, 'subscription': u'onet'}, 
   {'total': 2, 'subscription': u'niebezpiecznik'}, 
   {'total': 1, 'subscription': u'gazeta'}
]
我需要的是类似的完整对象列表:

[
   {'total': 3, 'subscription': <Subscription: onet>}, 
   {'total': 2, 'subscription': <Subscription: niebezpiecznik>}, 
   {'total': 1, 'subscription': <Subscription: gazeta>}
]
[
{'total':3,'subscription':},
{'total':2,'subscription':},
{'total':1,'subscription':}
]

我不确定“select_related”在这里是否有用,但我不知道如何使用它:(

也许您可以使用dict和list comprehension,并将其作为简单的python对象过滤:

d = {sub.visable_name: sub for sub in Subscriptions.objects.all()}
new_rank = [
  {
    'total': row['total'], 
    'subscriptions': d[row['subscriptions']]
  } 
  for row in rank
]
将提供什么:

>> new_rank
[
  {'total': 3, 'subscriptions': <Subscriptions: onet>}, 
  {'total': 2, 'subscriptions': <Subscriptions: niebezpiecznik>}, 
  {'total': 1, 'subscriptions': <Subscriptions: gazeta.pl>}
]
>新排名
[
{'total':3,'subscriptions':},
{'total':2,'subscriptions':},
{'total':1,'subscriptions':}
]

最好从
订阅构建查询,因为您需要它:

Subscription.objects.annotate(total=models.Count('usersubs')).order_by('-total')

这将给我:
[,]
。有没有办法也为每个订阅获取
总计
?没关系!现在我明白了,
总计
现在是每个订阅的属性:)谢谢!:)