Как проверить, существует ли связь? 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()

Но, возможно, есть еще лучший способ.

If you define a ManyToManyModel [Django-doc], Django automatically defines one in reverse with the value for the related_name=… parameter [Django-doc] as name, so you can use:

class GroupSerializer(serializers.ModelSerializer):
    empty = serializers.SerializerMethodField()
    
    class Meta:
        # …
        
    def get_empty(self, obj):
        return not group.users_group.exists()

Но это не очень эффективно, если вы хотите сериализовать большое количество Groups: для каждого Group будет выполняться дополнительный запрос. Вы можете использовать BooleanField:

class GroupSerializer(serializers.ModelSerializer):
    empty = serializers.BooleanField()
    
    class Meta:
        # …

и затем в APIView или ViewSet использовать как QuerySet 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'))
        )
    )
    # …
Вернуться на верх