получить количество объектов из ManyToManyField в Django Rest Framework - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть модель пользователя и события,

class User(AbstractUser):
    bio = models.CharField(max_length=255, blank=False, default='')

class Event(models.Model):
    name    = models.CharField(max_length=50)
    user    = models.ManyToManyField("User", related_name='event_player')

Я получаю количество пользователей, зарегистрированных в событиях, я пытался

Попробуйте 1

class EventSerializer(serializers.ModelSerializer):

    players_count = serializers.IntegerField(
        source='user_set.count', 
        read_only=True
    )

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

Попробуйте 2

class EventSerializer(serializers.ModelSerializer):

    players_count = serializers.SerializerMethodField()

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

    def get_players_count(self, obj):
        return obj.user_set.all().count()

Попробуйте 3

class EventSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        return {'id': instance.pk, 'players_count': instance.user__count}

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

Но ни один из них не имеет смысла, Как я могу получить общее количество вложенных пользователей ManyToMany. Я новичок в DRF, пожалуйста, помогите мне решить эту проблему.
Любая помощь приветствуется, спасибо.

1 Ответ

4 голосов
/ 12 февраля 2020

Try 2 должен работать без _set См. Django ManyToMany Docs для получения дополнительной информации

class EventSerializer(serializers.ModelSerializer):

    players_count = serializers.SerializerMethodField()

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

    def get_players_count(self, obj):
        return obj.user.all().count()
...