【问题标题】:Django REST Framework : How to define nested viewsets and get more explicit lookup_field names?Django REST Framework:如何定义嵌套视图集并获得更明确的lookup_field 名称?
【发布时间】:2021-12-20 10:14:47
【问题描述】:

上下文

我有两个视图集,它们有自己的路由器来自动从它们生成 URL:

  • 模型视图集
  • 模型B视图集

目前,只能通过以下 URL 访问 ModelAViewset 详细信息:

{root_url}/model-a/<slug>

'<slug>' 是 ModelA 的'slug' 字段,作为lookup_field。

我正在尝试找出一种方法来构建通往 ModelBViewset 详细信息的路线,如下所示:{root_url}/model-a/<model_a_slug>/model-b/<model_b_pk>

问题

  1. 有没有办法根据模型名称动态使用更明确的lookup_field 值?像这样:{root_url}/model-a/<model_a_slug>

注意:为了在模型中保持简单,我宁愿保留 ModelA 的“slug”字段名称

  1. 基于 Viewsets 和 Routers,有没有办法通过 multi lookup_fields 访问 ModelBViewset 的详细信息?使用如下网址:

    {root_url}/model-a/<model_a_slug>/model-b/<model_b_pk>

谢谢,提前

【问题讨论】:

  • DRF nested routers可以帮你实现{root_url}/model-a/<model_a_slug>/model-b/<model_b_pk>
  • 谢谢,确实,我昨天看到了。但似乎不可能使用“slug”而不是“pk”作为lookup_field
  • ModelAViewset中,您可以按照docs中的描述设置lookup_field = 'slug'以使用模型字段slug而不是pk
  • 然后当你使用嵌套路由器时,你可以对ModelBViewset做同样的事情,这样你就可以得到{root_url}/model-a/<model_a_slug>/model-b/<model_b_slug>

标签: django django-models django-rest-framework lookup django-rest-viewsets


【解决方案1】:

如果您在模型上使用lookup_field,则对该字段的引用仅适用于定义了lookup_field 的模型。

那样,要像 {root_url}/model-a/<model_a_slug>/model-b/<model_b_pk> 这样工作,您必须覆盖 ModelBViewset get_object 函数 或者你可以关注this steps

引用slug 字段的另一种方法是在模型本身中将其创建为primary_key,如下所示:

class ModelA(model.Model):

    slug = models.SlugField(
        max_length=60,
        unique=True,
        help_text="Define primary_key=true.",
        blank=True,
        primary_key=True
    )

这样,每次您在此模型或您想要的其他模型 ({root_url}/model-a/<model_a_slug>/model-b/<model_b_pk>) 中引用对象时,都需要使用 slug 字段而不是 idid 字段不再存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2017-10-07
    • 1970-01-01
    相关资源
    最近更新 更多