栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django模型-如何过滤ForeignKey对象的数量

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django模型-如何过滤ForeignKey对象的数量

听起来像是一份工作

extra

A.objects.extra(    select={        'b_count': 'SELECT COUNT(*) FROM yourapp_b WHERe yourapp_b.a_id = yourapp_a.id',    },    where=['b_count < 2'])

如果B计数通常是您需要的过滤或排序标准,或者需要显示在列表视图中,则可以考虑通过将b_count字段添加到A模型并在添加B或添加B时使用信号对其进行更新来考虑非规范化已删除:

from django.db import connection, transactionfrom django.db.models.signals import post_delete, post_savedef update_b_count(instance, **kwargs):    """    Updates the B count for the A related to the given B.    """    if not kwargs.get('created', True) or kwargs.get('raw', False):        return    cursor = connection.cursor()    cursor.execute(        'UPDATE yourapp_a SET b_count = (' 'SELECT COUNT(*) FROM yourapp_b ' 'WHERe yourapp_b.a_id = yourapp_a.id'        ') '        'WHERe id = %s', [instance.a_id])    transaction.commit_unless_managed()post_save.connect(update_b_count, sender=B)post_delete.connect(update_b_count, sender=B)

另一种解决方案是在添加或删除相关的B时管理A对象上的状态标志。

B.objects.create(a=some_a)if some_a.hidden and some_a.b_set.count() > 1:    A.objects.filter(id=some_a.id).update(hidden=False)...some_a = b.asome_b.delete()if not some_a.hidden and some_a.b_set.count() < 2:    A.objects.filter(id=some_a.id).update(hidden=True)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号