I have three models like this (Simplified).
class Locker(CoreModel):
def __str__(self):
return self.name
topic = models.CharField(
verbose_name=_('topic'),
help_text=_("locker description"),
null=True,
max_length=1024
)
name = models.CharField(
verbose_name=_('name'),
help_text=_("locker name"),
max_length=100,
validators=(
MinLengthValidator(2),
)
)
owner = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
related_name='owned_locker_set',
verbose_name=_('owner'),
on_delete=models.CASCADE
)
class Folder(CoreModel):
def __str__(self):
return self.name
name = models.CharField(
verbose_name=_('name'),
help_text=_('name of the folder'),
max_length=256
)
parent = models.ForeignKey(
to='self',
verbose_name=_('parent'),
on_delete=models.CASCADE,
null=True
)
locker = models.ForeignKey(
to='lockers.Locker',
verbose_name=_('locker'),
on_delete=models.CASCADE,
editable=False
)
class Upload(CoreModel):
def __str__(self):
return self.name
name = models.CharField(
verbose_name=_('name'),
help_text=_("upload name"),
max_length=100,
validators=(
MinLengthValidator(2),
)
)
locker = models.ForeignKey(
to='lockers.Locker',
verbose_name=_('locker'),
on_delete=models.CASCADE,
editable=False
)
parent = models.ForeignKey(
to='lockers.Folder',
verbose_name=_('folder'),
on_delete=models.CASCADE,
null=True
)
file = PrivateFileField(
verbose_name=_('file'),
help_text=_("raw file"),
upload_to='uploads/',
storage=private_storage
)
as you can see, the structure is recursive. Ideally, from the frontend, I would want to make a single request to return all the files and folders the locker has at the root level (parent is None). Then, I would also like to make requests to get all the files and folders inside of a specified folder ( when the user opens a folder at the frontend).
I am using Django Rest Framework right now. However, I cannot think of a way to achieve this because I would have to serialize two models into one view (I also want support for pagination). How can this be implemented in the simplest way?
Can someone please help me? Thanks a lot in advance!
relevant github discussion is here.
Edit I can imagine the endpoints structure to be like this.
# lists all files and folders in the locker.
path('lockers/<int:locker_id>/metadata/')
# lists all files and folders in the folder with the given pk.
path('lockers/<int:locker_id>/folders/<int:pk>/metadata/'),
# create an upload.
path('lockers/<int:locker_id>/uploads/')
# create and list the folders available.
path('lockers/<int:locker_id>/folders/'),