Как добавить поле модели, рассчитанное по данным из другой модели? - PullRequest
2 голосов
/ 13 февраля 2020

У меня есть следующие модели:

# models.py
class Test(models.Model):
    name = models.CharField(max_length=40)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Tester(models.Model):
    test_id = models.ForeignKey(Test, on_delete=models.DO_NOTHING)
class TestViewset(viewsets.ModelViewSet):
    serializer_class = TestSerializers
    permission_classes = (permissions.IsAuthenticated,)

    def get_queryset(self):
        if self.request.user.is_superuser:
            return Test.objects.all()
        else:
            return Test.objects.filter(author=self.request.user)

Таким образом, каждый тест может быть сделан многими тестировщиками.

Мой wi sh состоит в подсчете, сколько тестеры провели тест , т.е. когда я выполняю запрос GET к TestViewset I wi sh, чтобы получить в дополнение к текущим полям [имя, автор] поле подсчета, для каждого теста, в котором указано, сколько тестеров имеет был проверен.

Ценю помощь!

1 Ответ

3 голосов
/ 13 февраля 2020

Вы можете аннотировать счет на уровне просмотра:

from django.db.models import Count

def get_queryset(self):
    if self.request.user.is_superuser:
        return Test.objects.all().annotate(count=Count("tester"))

А на уровне сериализатора вы можете использовать SerializerMethodField для рендеринга этого значения:

class TestSerializers:
    count = serializers.SerializerMethodField()

    def get_count(self, obj):
        if hasattr(obj, "count"):
            return obj.count
...