У меня есть модели:
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 автоматически определяет его в обратном порядке со значением для Параметр related_name=…
[Django-doc] в качестве имени, поэтому вы можете использовать:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.SerializerMethodField()
class Meta:
# …
def get_empty(self, obj):
return not group.users_group.exists()
Но это не очень эффективно, если вы хотите сериализовать большое количество Group
: для каждого Group
будет делаться дополнительный запрос. Вы можете использовать BooleanField
:
class GroupSerializer(serializers.ModelSerializer):
empty = serializers.BooleanField()
class Meta:
# …
а затем в APIView
или ViewSet
используйте как QuerySet
a QuerySet
, где вы делаете аннотацию с Подзапрос Exists
[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(
User.objects.filter(group=OuterRef('pk'))
)
)
# …