Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 计数前排除相关对象_Django_Django Orm - Fatal编程技术网

Django 计数前排除相关对象

Django 计数前排除相关对象,django,django-orm,Django,Django Orm,例如,我有3种型号User,A,B class A(models.Model): creator = models.ForeignKey( 'users.User', on_delete=models.CASCADE, related_name='A_set' ) class B(models.Model): user = models.ForeignKey( 'users.User', on_delete=models.CASCADE

例如,我有3种型号
User
A
B

class A(models.Model):
    creator = models.ForeignKey(
        'users.User', on_delete=models.CASCADE, related_name='A_set'
    )


class B(models.Model):
    user = models.ForeignKey(
        'users.User', on_delete=models.CASCADE, related_name='B_set'
    )
    a_model = models.ForeignKey(
        'a.A', on_delete=models.CASCADE, related_name='B_set'
    )
我想获得
B
的计数,其中
user
不是一个模型对象的
creator

我尝试了以下查询:

`User.objects.prefetch_related('B_set').last().B_set.exclude(a_model__creator=F('user')).count()`
以下是我的注释尝试:

User.objects.annotate(b_count=Count('B_set', filter=(~Q(B_set__A__creator=F('user')))))
User.objects.annotate(
    b_count=Count('B_set', filter=(~Q(B_set__A__creator=F('user'))))
)
但我得到了一个错误:

无法将关键字“user”解析为字段

然后它向我推荐与用户相关的字段。此外,我还尝试使用
F()
user
更改为
B\u set\u user
,但没有任何帮助。

使用您的注释:

User.objects.annotate(b_count=Count('B_set', filter=(~Q(B_set__A__creator=F('user')))))
User.objects.annotate(
    b_count=Count('B_set', filter=(~Q(B_set__A__creator=F('user'))))
)
这将导致一个查询,如:

SELECT user.*,
       COUNT(
           CASE WHEN NOT a.creator_id = user.id AND a.creator_id IS NOT NULL
           THEN b.id ELSE NULL END
       ) AS b_count
FROM user
LEFT OUTER JOIN b ON user.id = b.user_id
LEFT OUTER JOIN a ON b.a_model_id=a.id
GROUP BY user.id
这应该是
F('id')
,因为这已经是您正在注释的
用户
对象。