【问题标题】:Nested urls are not working with Django REST framework嵌套 url 不适用于 Django REST 框架
【发布时间】: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 有人可以帮帮我吗?

【问题讨论】:

    标签: django django-rest-framework django-urls


    【解决方案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 的该部分填写查找字段,防止出现重复的组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2014-05-21
      • 2019-01-09
      • 1970-01-01
      • 2021-06-23
      • 2014-09-18
      • 2018-05-17
      相关资源
      最近更新 更多