Вложенные сериализаторы Django не возвращают то, что я хочу

Я относительно новичок в Django и работаю над приложением, которое заставляет меня ломать голову. У меня есть две модели, определенные следующим образом:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    name = models.CharField(_('name'), max_length=50, blank=False)
    surname = models.CharField(_('surname'), blank=True, max_length=50)
    phone_number = models.CharField(validators=[phone_validator], max_length=16, blank=True) 


class History(models.Model):
    hist_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE
    )
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=False)
    actions = models.JSONField(default=dict)
    traces = models.JSONField(default=dict)

Я хочу получить список всех пользователей, и для каждого пользователя мне нужны все History объекты в виде списка. Вот View, который я создал:

class HistoryQuery(ListAPIView):
    serializer_class = HistorySerializer

    def get_queryset(self):
        return User.objects.all()

и вот serializer, который я пытаюсь использовать:

class HistorySerializer(serializers.Serializer):

    class HistorySummarySerializer(serializers.Serializer):

        class Meta:
            model = History
            fields = ['hist_id', 'user']

    history = HistorySummarySerializer(many=True, read_only=True)

    class Meta:
        model = User
        fields = ['history']

При такой настройке я получаю массив с длиной, равной количеству пользователей, которые есть в моей базе данных, но каждый из его элементов пуст. Я не могу понять, что я делаю неправильно, поэтому любая помощь будет принята с благодарностью. Должен ли я изменить свою логику и запросить модель History вместо этого?

Если это имеет значение, в базе данных около 20k+ History записей - возможно ли, что Django "ленится" и не загружает данные? Действительно, любой совет будет очень признателен.

Возможно, мне следует уточнить, что я хотел бы агрегировать History результаты за день для каждого пользователя, но мой текущий план состоит в том, чтобы идти по одному шагу за раз, поэтому я займусь этим, как только эта часть будет работать.

Поле вашей модели не то, что вы думаете. При создании отношения ForeignKey, если вы не указали кварг related_name, Django по умолчанию задаст {field_name}_set. Это означает, что если вы хотите получить историю для пользователя, вам придется сделать следующее:

User.objects.get(pk=1).history_set.all()

Ваш вложенный сериализатор ожидает, что история будет находиться в поле history, которого не существует.

Попробуйте добавить source=‘history_set’ во вложенное поле сериализатора

Вернуться на верх