我有一台A型和B型的,是这样的:

class A(models.Model):
  title = models.CharField(max_length=20)
  (...)

class B(models.Model):
  date = models.DateTimeField(auto_now_add=True)
  (...)
  a = models.ForeignKey(A)

现在我有大约A个和B个对象,我想要执行一个查询来 Select 指向它们的所有A个对象,这些对象少于2B个.

A有点像池,用户(B)加入池.如果只有1个或0个加入,则根本不应该显示池.

这样的模型设计可以吗?或者我应该稍微修改一下?

推荐答案

听起来像是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计数是您经常需要作为过滤或排序标准的内容,或者需要在列表视图上显示,您可以考虑go 规范化,方法是向A模型添加b_count字段,并在添加或删除B时使用信号更新它:

from django.db import connection, transaction
from django.db.models.signals import post_delete, post_save

def 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.a
some_b.delete()
if not some_a.hidden and some_a.b_set.count() < 2:
    A.objects.filter(id=some_a.id).update(hidden=True)

Django相关问答推荐

如何在Django上创建ManyToMany管理面板?

Django查询一个查询集的输入结果,以查找没有出现在另一个模型中的对象

从多个数据库访问 Django 会话

使用自定义的AuthBackend时,无法使用request.user.is_authenticated或@login_required修饰符

无法使用 django-filters 进行过滤

如何在 Fargate 容器中运行的 Django 中使用 AWS SES?

重建 Dockerfile 后,Django celery 无法从celery导入名称Celery

在 GoDaddy 上安装 django 站点

django-rest-framework 如何使模型序列化器字段成为必需

更好的 ArrayField 管理小部件?

TestCase 类中的 setUpClass、setUpTestData 和 setUp 有什么区别?

删除所有表的django命令是什么?

Django Admin - 覆盖自定义表单字段的小部件

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

Django post_save 在不覆盖模型 save() 的情况下防止递归

如何将 ManyToManyField 呈现为复选框?

Django unique_together 与可为空的 ForeignKey

在 Django 中的字段中添加额外的约束

Django中GROUP BY中注释的聚合

Django 用户配置文件