Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

proposal: DJA DefaultRouter#980

n2ygk started this conversation inIdeas
Discussion options

Proposal:rest_framework_json_api.routers.DefaultRouter

Current method of declaringURLPatterns

The current typical usage example is like this:

fromrest_frameworkimportroutersrouter=routers.DefaultRouter(trailing_slash=False)router.register(r'blogs',BlogViewSet)router.register(r'entries',EntryViewSet)urlpatterns= [# basic collection and item URLs:url(r'^',include(router.urls)),# relationships URLs:url(r'^entries/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)',EntryRelationshipView.as_view(),name='entry-relationships'),url(r'^blogs/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)',BlogRelationshipView.as_view(),name='blog-relationships'),# related URLs:url(r'entries/(?P<entry_pk>[^/.]+)/blog',BlogViewSet.as_view({'get':'retrieve'}),name='entry-blog'),]

URLPatterns created by the Default Router

The above creates the following URLPatterns forrouter.register(r'blogs', BlogViewSet):

 00 = {URLPattern} <URLPattern '^blogs$' [name='blog-list']>  default_args = {dict} {}  lookup_str = {str} 'example.views.BlogViewSet'  name = {str} 'blog-list'  pattern = {RegexPattern} ^blogs$   _is_endpoint = {bool} True   _regex = {str} '^blogs$'   _regex_dict = {dict} {}   converters = {dict} {}   name = {str} 'blog-list'   regex = {SRE_Pattern} re.compile('^blogs$') 01 = {URLPattern} <URLPattern '^blogs\.(?P<format>[a-z0-9]+)/?$' [name='blog-list']>  default_args = {dict} {}  lookup_str = {str} 'example.views.BlogViewSet'  name = {str} 'blog-list'  pattern = {RegexPattern} ^blogs\.(?P<format>[a-z0-9]+)/?$   _is_endpoint = {bool} True   _regex = {str} '^blogs\\.(?P<format>[a-z0-9]+)/?$'   _regex_dict = {dict} {}   converters = {dict} {}   name = {str} 'blog-list'   regex = {SRE_Pattern} re.compile('^blogs\\.(?P<format>[a-z0-9]+)/?$') 02 = {URLPattern} <URLPattern '^blogs/(?P<pk>[^/.]+)$' [name='blog-detail']>  default_args = {dict} {}  lookup_str = {str} 'example.views.BlogViewSet'  name = {str} 'blog-detail'  pattern = {RegexPattern} ^blogs/(?P<pk>[^/.]+)$   _is_endpoint = {bool} True   _regex = {str} '^blogs/(?P<pk>[^/.]+)$'   _regex_dict = {dict} {}   converters = {dict} {}   name = {str} 'blog-detail'   regex = {SRE_Pattern} re.compile('^blogs/(?P<pk>[^/.]+)$') 03 = {URLPattern} <URLPattern '^blogs/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='blog-detail']>  default_args = {dict} {}  lookup_str = {str} 'example.views.BlogViewSet'  name = {str} 'blog-detail'  pattern = {RegexPattern} ^blogs/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$

along with anapi-root view that lists the available registry entries. This is a nice feature.

Drawbacks of the current method

  • Relationships & related URLs follow a standard pattern yet have to be "manually" declared separately. This is hard to do, error prone and just plain annoying.
  • We might not need the.<format> flavor of each ViewSet. (Not a huge concern.)

Proposed:rest_framework_json_api.DefaultRouter

Create a DJA DefaultRouter that extends DRF's DefaultRouter:

  1. Add URLPatterns for relationships and theirRelationshipView. This seems pretty straightforward. Just add another argument toDefaultRouter.register() (or apply a default naming pattern) to add the RelationshipView.
  2. Add URLPatterns for related links. This is a bit harder as each related link has to be enumerated (link name and ViewSet).

The goal would be to have a URLPatterns that looks like this:

fromrest_framework_json_apiimportroutersrouter=routers.DefaultRouter(trailing_slash=False)router.register(r'blogs',BlogViewSet,BlogRelationshipView)router.register(r'entries',EntryViewSet,EntryRelationshipView, ??relatedstuffhere??)urlpatterns= [url(r'^',include(router.urls)),]

For how to do the "related stuff here" take a look at@Anton-Shutik's approach in#451

You must be logged in to vote

Replies: 12 comments

Comment options

I like the idea 👍

I think to register related urls as implemented in#451 will be fairly straight forward. With RelationshipView is going to be a bit harder but playing around with implementation might lead to a good solution. Only thing which also need to be considered is to implement a json api specificSimpleRouter andDefaultRouter as both might be used.

You must be logged in to vote
0 replies

This comment was marked as off-topic.

This comment was marked as off-topic.

This comment was marked as off-topic.

This comment was marked as off-topic.

Comment options

n2ygk
Aug 31, 2018
Maintainer Author

I've "moved" this comment thread about naming to it's own issue:#471

You must be logged in to vote
0 replies
Comment options

might be relatedencode/django-rest-framework#6789

You must be logged in to vote
0 replies
Comment options

Is this something the project is still interested in? When I started using DJA, I found it a little frustrating and unintuitive that we couldn't just "automatically" include the relationship and related resource routes.

If a PR is likely to be accepted, I could look into this within the next 1-2 weeks.

You must be logged in to vote
0 replies
Comment options

Is this something the project is still interested in? When I started using DJA, I found it a little frustrating and unintuitive that we couldn't just "automatically" include the relationship and related resource routes.

If a PR is likely to be accepted, I could look into this within the next 1-2 weeks.

A PR is certainly welcome in this regard

You must be logged in to vote
0 replies
Comment options

@platinumazure I don't think this will be straight forward but I would love to see this implemented as well.

You must be logged in to vote
0 replies
Comment options

This is a great idea which we should investigate further. Especially thinking about how theRelatedMixin could be replaced with a router as the current implementation is confusing especially when it comes to permissions and lacks feature such as filter support. See also#916

I do think though we should talk this through more about what a proper design of a DJA router would be and of such a discussion or proof of concept in that regard extract specific issues. Therefore converting this issue to a discussion.

You must be logged in to vote
0 replies
Comment options

Adding support for the built-in DRF routers would 100% clean up all the URL definition files and make DJA consistent with DRF. 👍

You must be logged in to vote
0 replies
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Category
Ideas
5 participants
@n2ygk@platinumazure@sliverc@auvipy@axieum
Converted from issue

This discussion was converted from issue #467 on September 23, 2021 17:31.


[8]ページ先頭

©2009-2025 Movatter.jp