如何检查关系是否存在?机对机

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>

但是如果你想序列化大量的Groups,这不是很有效:对于每个Group它会进行一个额外的查询。您可以使用 BooleanField:

class GroupSerializer(serializers.ModelSerializer):
    empty = serializers.<strong>BooleanField()</strong>
    
    class Meta:
        # …

然后在 APIViewViewSet 中使用 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>
        )
    )
    # …