嵌套 url 不适用于 Django REST 框架

Posted

技术标签:

【中文标题】嵌套 url 不适用于 Django REST 框架【英文标题】:Nested urls are not working with Django REST framework 【发布时间】:2014-12-31 06:48:01 【问题描述】:
url.py
router.register(r'Costumers', CostumerViewSet, base_name='costumer')
  .register(r'Agreements', AgreementViewSet, base_name='agreement', parents_query_lookups=['costumer']).
      .register(r'Programs', ProgramViewSet,base_name='programs',parents_query_lookups=['agreement']),

model.py

class Costumer(models.Model):
  company_name = models.CharField(max_length=300)
  supplier = models.ForeignKey(Supplier)

class Agreement(models.Model): 
  agreement_name = models.CharField(max_length=300)
  programs = models.ManyToManyField(Program, through='Programs_in_Agreement')
  costumer = models.ForeignKey(Costumer)

class Program(models.Model):
  program_name = models.CharField(max_length=300)

class Programs_in_Agreement(models.Model):
   programs = models.ForeignKey(Program)
   agreement = models.ForeignKey(Agreement)

Im trying to get this page 
/api/v1/Costumers/1/Agreements/1/Programs/

and I've got this error
"^Costumers/(?P<parent_lookup_agreement>[^/.]+)/Agreements/(?P<parent_lookup_agreement>[^/.]+)/Programs/$" is not a valid regular expression: redefinition of group name 'parent_lookup_agreement' as group 2; was group 1

程序和协议之间的关系是 M2M 协议和客户的关系是M21 有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

您正在嵌套路由器,这意味着您正在使用嵌套路由器插件之一。问题是您没有为最后一次register 调用提供所有查找字段。

看起来你想要实现的关系是

程序 -> 协议 -> 客户

路由器正在生成

消费者 协议 -> 客户 程序 -> 协议 -> 客户

-&gt; 表示正在进行的查找。 必须手动提供查找,通过传入parents_query_lookups 进行注册。这很重要,否则插件必须猜测查找是什么,而且它肯定是错误的。查找不会跨路由器的嵌套维护,因此在路由器 A 上定义的查找不会传递到路由器 B,它必须在路由器 B 上重复

所以你在注册路由器时应该做的是传入父查找。下面的 sn-p 应该可以工作:

router.register(r'Costumers', CostumerViewSet, base_name='costumer')
  .register(r'Agreements', AgreementViewSet, base_name='agreement', parents_query_lookups=['costumer']).
      .register(r'Programs', ProgramViewSet, base_name='programs', parents_query_lookups=['agreement__costumer', 'agreement'])

注意在最后一次调用的parents_query_lookups 中添加了agreement__costumer。这允许插件为 URL 的该部分填写查找字段,防止出现重复的组。

【讨论】:

以上是关于嵌套 url 不适用于 Django REST 框架的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 中嵌套 URL 的相关资源

django-rest-swagger 是不是不适用于模型序列化器?

C# HttpClient PostAsync 不适用于 django rest 框架

django-cors-headers 不适用于 DRF(Django Rest 框架)

嵌套路由上的 Django REST 权限

Django REST框架的嵌套API视图?