嵌套 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
调用提供所有查找字段。
看起来你想要实现的关系是
程序 -> 协议 -> 客户
路由器正在生成
消费者 协议 -> 客户 程序 -> 协议 -> 客户
->
表示正在进行的查找。 必须手动提供查找,通过传入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 框架