Skip to content

The Field

pookieStorage exports a single field: FileField.

from pookieStorage.fields import FileField

This is a full superset of Django's native FileField. Every argument Django's FileField accepts works identically. The only change in existing code is the import line.

# before
from django.db.models import FileField

# after
from pookieStorage.fields import FileField

Basic usage

from django.db import models
from pookieStorage.fields import FileField


class Document(models.Model):
    file = FileField(upload_to='uploads/')

Files land in uploads/ on whichever backend POOKIE_STORAGE_BACKEND points to.

With a callable upload_to

from django.db import models
from pookieStorage.fields import FileField


def assignLocation(instance, filename):
    return f"users/{instance.owner.pk}/{filename}"


class Document(models.Model):
    file = FileField(upload_to=assignLocation)

With a callable storage override

from django.conf import settings
from django.db import models
from pookieStorage.fields import FileField


def getStorage():
    if settings.DEBUG:
        return LocalStorage()
    return R2MediaStorage()


class Document(models.Model):
    file = FileField(upload_to='uploads/', storage=getStorage)

When storage is provided on the field, it takes full precedence over POOKIE_STORAGE_BACKEND for that field only. Most models will never need this.

With blank and null

from django.db import models
from pookieStorage.fields import FileField


class Document(models.Model):
    file = FileField(upload_to='uploads/', blank=True, null=True)

Full model example

from uuid import uuid4
from django.db import models
from django.contrib.auth import get_user_model
from pookieStorage.fields import FileField

User = get_user_model()


def assignNameAndLocation(instance, filename):
    return f"users/{instance.fileOwner.pk}/{uuid4()}/{filename}"


class FileItem(models.Model):
    fileTag = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    fileName = models.TextField()
    fileField = FileField(upload_to=assignNameAndLocation)
    fileOwner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_files")
    uploadedDate = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ("-uploadedDate",)

Saving files

From a request:

instance.file = request.FILES["file"]
instance.save()

From a ContentFile:

from django.core.files.base import ContentFile

instance.file = ContentFile(b"file bytes", name="report.pdf")
instance.save()

From a local path:

from django.core.files import File

with open("/tmp/report.pdf", "rb") as f:
    instance.file.save("report.pdf", File(f))

Using alongside Django's native FileField

from django.db import models
from django.db.models import FileField as DjangoFileField
from pookieStorage.fields import FileField as PookieFileField


class Document(models.Model):
    legacyFile = DjangoFileField(upload_to='legacy/')
    newFile = PookieFileField(upload_to='uploads/')

Both fields coexist without conflict.