如何检查关系是否存在?机对机
How to check if a relation exists? M2M
我有模特:
class User(models.Model):
...
group = models.ManyToManyField(
Group, related_name="users_group",
)
class Group(models.Model):
....
如何在序列化器中检查Group
是否为空(与User
没有关系)
我的版本是:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.SerializerMethodField()
class Meta:
...
def get_empty(self, obj):
return not User.objects.filter(group=obj).exists()
但也许还有更好的方法。
如果你定义一个ManyToManyModel
[Django-doc], Django automatically defines one in reverse with the value for the related_name=…
parameter [Django-doc]作为名字,那么你可以使用:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.SerializerMethodField()
class Meta:
# …
def get_empty(self, obj):
return not group<strong>.users_group.exists()</strong>
但是如果你想序列化大量的Group
s,这不是很有效:对于每个Group
它会进行一个额外的查询。您可以使用 BooleanField
:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.<strong>BooleanField()</strong>
class Meta:
# …
然后在 APIView
或 ViewSet
中使用 as QuerySet
a QuerySet
并在其中使用 Exists
subquery [Django-doc] 进行注释以检查是否存在Group
:
存在一个用户
from django.db.models import Exists, OuterRef
from rest_framework import viewsets
class MyModelViewSet(viewsets.ModelViewSet):
queryset = Group.objects.annotate(
empty=~Exists(
<strong>User.objects.filter(group=OuterRef('pk'))</strong>
)
)
# …
我有模特:
class User(models.Model):
...
group = models.ManyToManyField(
Group, related_name="users_group",
)
class Group(models.Model):
....
如何在序列化器中检查Group
是否为空(与User
没有关系)
我的版本是:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.SerializerMethodField()
class Meta:
...
def get_empty(self, obj):
return not User.objects.filter(group=obj).exists()
但也许还有更好的方法。
如果你定义一个ManyToManyModel
[Django-doc], Django automatically defines one in reverse with the value for the related_name=…
parameter [Django-doc]作为名字,那么你可以使用:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.SerializerMethodField()
class Meta:
# …
def get_empty(self, obj):
return not group<strong>.users_group.exists()</strong>
但是如果你想序列化大量的Group
s,这不是很有效:对于每个Group
它会进行一个额外的查询。您可以使用 BooleanField
:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.<strong>BooleanField()</strong>
class Meta:
# …
然后在 APIView
或 ViewSet
中使用 as QuerySet
a QuerySet
并在其中使用 Exists
subquery [Django-doc] 进行注释以检查是否存在Group
:
from django.db.models import Exists, OuterRef
from rest_framework import viewsets
class MyModelViewSet(viewsets.ModelViewSet):
queryset = Group.objects.annotate(
empty=~Exists(
<strong>User.objects.filter(group=OuterRef('pk'))</strong>
)
)
# …