Django ORM 什么时候检查
Django ORM When check
我想查询特定用户是否与特定对象有关系。
例如:
user = User.objects.first()
modelA.objects.annotate(has_user=Case(When( XXXXXX,
then=Value(True)), default=Value(False), output_field=BooleanField())))
XXXX 应替换为检查 model_b_set.values_list('user', flat=True)
是否包含给定用户的代码。
已更新
class ModelA(models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='model_a_set')
class ModelB(models.Model):
modelA = models.ForeignKey('models_a.ModelA', on_delete=models.CASCADE, related_name='model_b_set')
user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='model_b_set')
用户模型是自定义的,但不会反映在其他模型上
还更新了代码示例以适合我的示例模型
我认为在这里使用带有子查询的 Exists
[Django-doc] 更好,例如:
from django.db.models import Exists, OuterRef
modelA.objects.annotate(
is_following_by_user=Exists(
ModelB.objects.filter(user=my_user, modelA=OuterRef('pk'))
)
)
因此我们检查每个 ModelA
对象是否存在 ModelB
其中 user
是 my_user
,并且 modelA
是主键ModelA
对象。
我想查询特定用户是否与特定对象有关系。 例如:
user = User.objects.first()
modelA.objects.annotate(has_user=Case(When( XXXXXX,
then=Value(True)), default=Value(False), output_field=BooleanField())))
XXXX 应替换为检查 model_b_set.values_list('user', flat=True)
是否包含给定用户的代码。
已更新
class ModelA(models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='model_a_set')
class ModelB(models.Model):
modelA = models.ForeignKey('models_a.ModelA', on_delete=models.CASCADE, related_name='model_b_set')
user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='model_b_set')
用户模型是自定义的,但不会反映在其他模型上 还更新了代码示例以适合我的示例模型
我认为在这里使用带有子查询的 Exists
[Django-doc] 更好,例如:
from django.db.models import Exists, OuterRef
modelA.objects.annotate(
is_following_by_user=Exists(
ModelB.objects.filter(user=my_user, modelA=OuterRef('pk'))
)
)
因此我们检查每个 ModelA
对象是否存在 ModelB
其中 user
是 my_user
,并且 modelA
是主键ModelA
对象。