【问题标题】:django rest framework recursive models endpoints structuredjango rest 框架递归模型端点结构
【发布时间】:2021-04-12 08:12:35
【问题描述】:

我有三个这样的模型(简体)。

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
    )

如您所见,该结构是递归的。 理想情况下,我想从前端发出一个请求以返回所有文件和文件夹 储物柜在根级别(父级为无)。然后,我还想请求获取指定文件夹内的所有文件和文件夹(当用户在前端打开文件夹时)。

我现在正在使用 Django Rest Framework。 但是,我想不出一种方法来实现这一点,因为我必须将两个模型序列化到一个视图中(我还需要支持分页)。如何以最简单的方式实现?

有人可以帮帮我吗? 提前非常感谢!

相关的github讨论是here

编辑 我可以想象端点结构是这样的。

# 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/'),

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    尝试在 DRF https://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing 中执行额外操作。您可以使用视图集中的 get_serializer_class 函数为每个操作定义序列化程序

    【讨论】:

    • 通过实施这个解决方案,我每次都必须发出两个请求来检索文件夹和文件,这不是我想要的。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2018-12-10
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多