django 从注解查询中排除用户

zd287kbt  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(214)

我正在尝试查询某个对话中的用户呈现。最后,我用这个注解来实现它:

products = products.annotate(
        conversation_users=Subquery(
            Conversation.objects.filter(
                product=OuterRef('pk')
            ).annotate(
                users_array=ArrayAgg('users__username')
            ).values_list('users_array', flat=True)[:1]
        )
    )

这是返回一个列表,其中用户存在于对话中(在大多数情况下只有两个)。我需要从那里排除request.user,这样我总是得到与我对话的用户的值。
我尝试使用这个Q查询来排除请求。user:

.filter(~Q(users=user)).values_list('users_array', flat=True)[:1]
        )

但它现在使字段返回None。我怎么能做到呢?

编辑1:

这些是相关型号,产品型号:

class Product(models.Model):
    creator = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='anken')
    content = models.TextField(blank=True, null=True)
    date = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=True)
    intouch = models.ManyToManyField(
        User, related_name='product_intouch', blank=True)

这就是对话模式:

class Conversation(models.Model):
    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, related_name='conversations')
    users = models.ManyToManyField(User, related_name='conversations')
    

    def validate_unique(self, *args, **kwargs):
        super().validate_unique(*args, **kwargs)
        if Conversation.objects.filter(product=self.product, users__in=self.users.all()).exists():
            raise ValidationError(
                'A conversation with the same Product and user already exists.')
6ljaweal

6ljaweal1#

你在聚合中过滤掉这个:

from django.contrib.postgres.aggregates import ArrayAgg
from django.db.models import OuterRef, Q, Subquery

products = products.annotate(
    conversation_users=Subquery(
        Conversation.objects.filter(
            product=OuterRef('pk'),
        )
        .annotate(users_array=ArrayAgg('users__username', filter=~Q(users=user)))
        .values_list('users_array', flat=True)[:1]
    )
)

相关问题