python - 如何计算 Django 连接表中的对象数量?

标签 python mysql sql django

我的问题很简单:我有 Users 拥有 Assets 或属于 Users 的 Assets 如果您愿意,我无法做到检索每个用户拥有的 Assets 的数量(计数)。我知道这对你们大多数人来说可能听起来很愚蠢,但我是 python/django(来自 PHP/MySQL)的新手,我不知道这里的工作原理。我不想使用原始 SQL - 如果没有其他方法,这将是我最后的选择。

(*) 我已经从代码中删除了所有不相关的原始数据

用户

class Users(models.Model):
    firstname = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)

Assets

class Assets(models.Model):
    serial = models.CharField(unique=True, max_length=100)
    user = models.ForeignKey('Users', blank=True, null=True)

    # this is what I am playing with to retrieve the number of assets each user owns
    @classmethod
        def user_assets(self):
            return Assets.objects.filter(user=user).count()

views.py

class UserList(ListView):
    model = Users
    def get_context_data(self, **kwargs):
        context = super(UserList, self).get_context_data(**kwargs)
        context['user_assets'] = self.model.user_assets()
        return context

模板

{% for user in object_list %}
     <tr>
         <td>{{ user.id }}</td>
         <td>
             {{ user_assets }}
         </td>
     </tr>
{% endfor %}

我怎样才能得到这个号码?我已阅读有关聚合、注释和过滤器的内容,但无法真正理解。

编辑:

我正在寻找一种使用基于类的 View 且易于扩展的简单解决方案(我可能想稍后添加其他模型)

最佳答案

在您的 UserList 中,而不是使用模型,使用这个查询集:

from django.db.models import Count

class UserList(ListView):
    queryset = Users.objects.annotate(num_assets=Count('assets'))

并像这样定义您的用户字段:

user = models.ForeignKey('Users', blank=True, null=True, related_name='assets')

然后从模板:

{{ user.num_assets }}

另外请记住,最好使用单数模型名称,以避免与反向关系名称混淆。

关于python - 如何计算 Django 连接表中的对象数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512647/

相关文章:

python - 将python pickled对象存储到mysql + django中

python - "Fire and forget"来自 Python 脚本的进程

Mysql存储过程while循环两次

mysql - 具有父类(super class)型表的其他 JOIN 结果的 JOIN 表

左连接中的mysql搜索

python - 如何在 Python 中生成可重现(带有种子)的随机 UUID

php - 不要在 mysql 数据库中复制内容

mysql - 如何存储本质上是与 SQL 中的唯一值相关联的列表的数据

sql - 如何在SQL Server上模拟DEADLOCK?

python - 在 python 中使用 cv2.findContours 函数时出现 ValueError