我正在尝试查询某个对话中的用户呈现。最后,我用这个注解来实现它:
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.')
1条答案
按热度按时间6ljaweal1#
你在聚合中过滤掉这个: