146👍
Because it’s a HyperlinkedModelSerializer
your serializer is trying to resolve the URL for the related User
on your Bottle
.
As you don’t have the user detail view it can’t do this. Hence the exception.
- Would not just registering the
UserViewSet
with the router solve your issue? - You could define the user field on your
BottleSerializer
to explicitly use theUserSerializer
rather than trying to resolve the URL. See the serializer docs on dealing with nested objects for that.
90👍
I came across this error too and solved it as follows:
The reason is I forgot giving “**-detail” (view_name, e.g.: user-detail) a namespace. So, Django Rest Framework could not find that view.
There is one app in my project, suppose that my project name is myproject
, and the app name is myapp
.
There is two urls.py file, one is myproject/urls.py
and the other is myapp/urls.py
. I give the app a namespace in myproject/urls.py
, just like:
url(r'', include(myapp.urls, namespace="myapp")),
I registered the rest framework routers in myapp/urls.py
, and then got this error.
My solution was to provide url with namespace explicitly:
class UserSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="myapp:user-detail")
class Meta:
model = User
fields = ('url', 'username')
And it solved my problem.
- [Django]-How does Django's nested Meta class work?
- [Django]-Is it better to use path() or url() in urls.py for django 2.0?
- [Django]-Why does django run everything twice?
27👍
Another nasty mistake that causes this error is having the base_name unnecessarily defined in your urls.py. For example:
router.register(r'{pathname}', views.{ViewName}ViewSet, base_name='pathname')
This will cause the error noted above. Get that base_name outta there and get back to a working API. The code below would fix the error. Hooray!
router.register(r'{pathname}', views.{ViewName}ViewSet)
However, you probably didn’t just arbitrarily add the base_name, you might have done it because you defined a custom def get_queryset() for the View and so Django mandates that you add the base_name. In this case you’ll need to explicitly define the ‘url’ as a HyperlinkedIdentityField for the serializer in question. Notice we are defining this HyperlinkedIdentityField ON THE SERIALIZER of the view that is throwing the error. If my error were “Could not resolve URL for hyperlinked relationship using view name “study-detail”. You may have failed to include the related model in your API, or incorrectly configured the lookup_field
attribute on this field.” I could fix this with the following code.
My ModelViewSet (the custom get_queryset is why I had to add the base_name to the router.register() in the first place):
class StudyViewSet(viewsets.ModelViewSet):
serializer_class = StudySerializer
'''custom get_queryset'''
def get_queryset(self):
queryset = Study.objects.all()
return queryset
My router registration for this ModelViewSet in urls.py:
router.register(r'studies', views.StudyViewSet, base_name='studies')
AND HERE’S WHERE THE MONEY IS! Then I could solve it like so:
class StudySerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="studies-detail")
class Meta:
model = Study
fields = ('url', 'name', 'active', 'created',
'time_zone', 'user', 'surveys')
Yep. You have to explicitly define this HyperlinkedIdentityField on itself for it to work. And you need to make sure that the view_name
defined on the HyperlinkedIdentityField is the same as you defined on the base_name
in urls.py with a ‘-detail’ added after it.
- [Django]-Logging in Django and gunicorn
- [Django]-How do you perform Django database migrations when using Docker-Compose?
- [Django]-Best practice for Django project working directory structure
25👍
Maybe someone can have a look at this : http://www.django-rest-framework.org/api-guide/routers/
If using namespacing with hyperlinked serializers you’ll also need to ensure that any view_name parameters on the serializers correctly reflect the namespace. For example:
urlpatterns = [
url(r'^forgot-password/$', ForgotPasswordFormView.as_view()),
url(r'^api/', include(router.urls, namespace='api')),
]
you’d need to include a parameter such as view_name='api:user-detail'
for serializer fields hyperlinked to the user detail view.
class UserSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="api:user-detail")
class Meta:
model = User
fields = ('url', 'username')
- [Django]-How to set the timezone in Django
- [Django]-RuntimeWarning: DateTimeField received a naive datetime
- [Django]-How can I filter a Django query with a list of values?
13👍
This code should work, too.
class BottleSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer()
class Meta:
model = Bottle
fields = ('url', 'wine', 'user')
- [Django]-Aggregate() vs annotate() in Django
- [Django]-Django template includes slow?
- [Django]-How to implement followers/following in Django
9👍
Today, I got the same error and below changes rescue me.
Change
class BottleSerializer(serializers.HyperlinkedModelSerializer):
to:
class BottleSerializer(serializers.ModelSerializer):
- [Django]-IOS app with Django
- [Django]-Django database query: How to get object by id?
- [Django]-Django py.test does not find settings module
8👍
I ran into this error after adding namespace to my url
url('api/v2/', include('api.urls', namespace='v2')),
and adding app_name to my urls.py
I resolved this by specifying NamespaceVersioning for my rest framework api in settings.py of my project
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.NamespaceVersioning'}
- [Django]-Django Rest Framework custom response message
- [Django]-AssertionError: database connection isn't set to UTC
- [Django]-How to assign items inside a Model object with Django?
7👍
TL;DR: It may be as simple as removing a trailing ‘s’ from the router basename. No need to define a url field in your serializer.
For the original poster, the issue was resolved simply by registering the UserViewSet, as suggested in the top answer.
However, if anyone else has this issue even with all ViewSets registered, I think I’ve figured out what’s going wrong, and I’ve found a solution that’s cleaner than a lot of the others here.
In my case, I encountered this issue after trying to create a ViewSet with a custom get_queryset() function. When I replaced the ViewSet’s queryset field with a custom get_queryset() function, I was then hit with this error:
AssertionError: `basename` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.
So, of course, I went to urls.py and modified my registration to include a basename as such:
router.register(r'messages', MessageViewSet, basename='messages')
But then I was hit with this error (as we see in the original post):
Could not resolve URL for hyperlinked relationship using view name "message-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.
After reading the DRF docs on routers, I learned that the router automatically generates two url patterns for you, which have names:
- ‘basename-list’
- ‘basename-detail’
Because I set my basename=’messages’ (note the ‘s’ at the end), my url patterns were named:
- ‘messages-list’
- ‘messages-detail’
Since DRF was looking a url pattern named ‘message-detail’ (note here the lack of ‘s’), I realized that I could resolve this simply by removing the trailing ‘s’ from my basename as such:
router.register(r'messages', MessageViewSet, basename='message')
My final serializer and ViewSet implementations were as simple as this!
class MessageSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Message
fields = ['url', 'message', 'timestamp', 'sender', ...]
class MessageViewSet(viewsets.ModelViewSet):
serializer_class = MessageSerializer
def get_queryset(self):
return Message.objects.filter(...)
- [Django]-Django – how to visualize signals and save overrides?
- [Django]-Is there a way to loop over two lists simultaneously in django?
- [Django]-Django: For Loop to Iterate Form Fields
3👍
It appears that HyperlinkedModelSerializer
do not agree with having a path namespace
. In my application I made two changes.
# rootapp/urls.py
urlpatterns = [
# path('api/', include('izzi.api.urls', namespace='api'))
path('api/', include('izzi.api.urls')) # removed namespace
]
In the imported urls file
# app/urls.py
app_name = 'api' // removed the app_name
Hope this helps.
- [Django]-Changing a project name in django
- [Django]-How to test "render to template" functions in django? (TDD)
- [Django]-Django stops working with RuntimeError: populate() isn't reentrant
2👍
Same Error, but different reason:
I define a custom user model, nothing new field:
from django.contrib.auth.models import (AbstractUser)
class CustomUser(AbstractUser):
"""
custom user, reference below example
https://github.com/jonathanchu/django-custom-user-example/blob/master/customuser/accounts/models.py
# original User class has all I need
# Just add __str__, not rewrite other field
- id
- username
- password
- email
- is_active
- date_joined
- method, email_user
"""
def __str__(self):
return self.username
This is my view function:
from rest_framework import permissions
from rest_framework import viewsets
from .models import (CustomUser)
class UserViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.AllowAny,)
serializer_class = UserSerializer
def get_queryset(self):
queryset = CustomUser.objects.filter(id=self.request.user.id)
if self.request.user.is_superuser:
queryset = CustomUser.objects.all()
return queryset
Since I didn’t give queryset
directly in UserViewSet
, I have to set base_name
when I register this viewset. This is where my error message caused by urls.py
file:
from myapp.views import (UserViewSet)
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'users', UserViewSet, base_name='customuser') # <--base_name needs to be 'customuser' instead of 'user'
You need a base_name
same as your model name – customuser
.
- [Django]-How to test auto_now_add in django
- [Django]-How do I clone a Django model instance object and save it to the database?
- [Django]-Django testing: Test the initial value of a form field
2👍
If you’re extending the GenericViewSet and ListModelMixin classes, and have the same error when adding the url field in the list view, it’s because you’re not defining the detail view. Be sure you’re extending the RetrieveModelMixin mixin:
class UserViewSet (mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
- [Django]-How can I avoid "Using selector: EpollSelector" log message in Django?
- [Django]-No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model
- [Django]-How to get Django and ReactJS to work together?
1👍
I was stuck in this error for almost 2 hours:
ImproperlyConfigured at /api_users/users/1/
Could not resolve URL for hyperlinked relationship using view name “users-detail”. You may have failed to include the related model in your API, or incorrectly configured the lookup_field
attribute on this field.
When I finally get the solution but I don’t understand why, so my code is:
#models.py
class Users(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50, blank=False, null=False)
email = models.EmailField(null=False, blank=False)
class Meta:
verbose_name = "Usuario"
verbose_name_plural = "Usuarios"
def __str__(self):
return str(self.name)
#serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Users
fields = (
'id',
'url',
'name',
'email',
'description',
'active',
'age',
'some_date',
'timestamp',
)
#views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = Users.objects.all()
serializer_class = UserSerializer
#urls_api.py
router = routers.DefaultRouter()
router.register(r'users',UserViewSet, base_name='users')
urlpatterns = [
url(r'^', include(router.urls)),
]
but in my main URLs, it was:
urlpatterns = [
url(r'^admin/', admin.site.urls),
#api users
url(r'^api_users/', include('usersApi.users_urls', namespace='api')),
]
So to finally I resolve the problem erasing namespace:
urlpatterns = [
url(r'^admin/', admin.site.urls),
#api users
url(r'^api_users/', include('usersApi.users_urls')),
]
And I finally resolve my problem, so any one can let me know why, bests.
- [Django]-Cross domain at axios
- [Django]-Django 1.7 – App 'your_app_name' does not have migrations
- [Django]-How do I do an OR filter in a Django query?
1👍
I had the same problem , I think you should check your
get_absolute_url
object model’s method input value (**kwargs) title.
and use exact field name in lookup_field
- [Django]-Check if celery beat is up and running
- [Django]-Django index page best/most common practice
- [Django]-Django simple_tag and setting context variables
1👍
A bit late but in Django 3 and above, include
doesn’t support namespace
without specifying the app_name
. Checking the source code for include
, we see that the condition
if namespaces and not app_name:
....
is checked. And still from the source code, app_name is gotten like;
urlconf_module, app_name = arg
where arg
is the first argument of the include
. This tells us that, our include
should be defined as
include((app.urls, app_name), namespace='...')
Example
Say you have a project myproject
and an app myapp
. Then you want to establish an address. You should use a viewset and define a router as below
myapp.urls
router.register('address', exampleviewset, basename='address')
myproject.urls
path('api/v1/', include(('myapp.urls', 'myapp'), namespace='myapp')),
serializers.py
class AddressSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="myapp:address-detail")
class Meta:
model = Address
fields = ('url',...)
Apparently, we can’t use fields='__all__'
. We must include url
explicitly and list the remaining fields we need.
- [Django]-Django migration strategy for renaming a model and relationship fields
- [Django]-Django admin and MongoDB, possible at all?
- [Django]-Get the list of checkbox post in django views
0👍
I ran into the same error while I was following the DRF quickstart guide
http://www.django-rest-framework.org/tutorial/quickstart/ and then attempting to browse to /users. I’ve done this setup many times before without problems.
My solution was not in the code but in replacing the database.
The difference between this install and the others before was when I created the local database.
This time I ran my
./manage.py migrate
./manage.py createsuperuser
immediately after running
virtualenv venv
. venv/bin/activate
pip install django
pip install djangorestframework
Instead of the exact order listed in the guide.
I suspected something wasn’t properly created in the DB. I didn’t care about my dev db so I deleted it and ran the ./manage.py migrate
command once more, created a super user, browsed to /users and the error was gone.
Something was problematic with the order of operations in which I configured DRF and the db.
If you are using sqlite and are able to test changing to a fresh DB then it’s worth an attempt before you go dissecting all of your code.
- [Django]-How to duplicate virtualenv
- [Django]-Django template includes slow?
- [Django]-Where's my JSON data in my incoming Django request?
0👍
Bottle = serializers.PrimaryKeyRelatedField(read_only=True)
read_only allows you to represent the field without having to link it to another view of the model.
- [Django]-Python (and Django) best import practices
- [Django]-How to format time in django-rest-framework's serializer?
- [Django]-Check if celery beat is up and running
0👍
I got that error on DRF 3.7.7 when a slug value was empty (equals to ”) in the database.
- [Django]-Remove Labels in a Django Crispy Forms
- [Django]-How to set the timezone in Django
- [Django]-Do I need Nginx with Gunicorn if I am not serving any static content?
0👍
I ran into this same issue and resolved it by adding generics.RetrieveAPIView
as a base class to my viewset.
- [Django]-How to concatenate strings in django templates?
- [Django]-How do you catch this exception?
- [Django]-Django model CharField: max_length does not work?
0👍
If you omit the fields ‘id’ and ‘url’ from your serializer you won’t have any problem. You can access to the posts by using the id that is returned in the json object anyways, which it makes it even easier to implement your frontend.
- [Django]-How do you use the django-filter package with a list of parameters?
- [Django]-Django dynamic model fields
- [Django]-Celery. Decrease number of processes
0👍
It is worth noting that if you create an action
with detail=False
(typo?) then this errors will be raised, replace it with detail=True
:
@action(detail=True)
...
- [Django]-Get count of related model efficiently in Django
- [Django]-Custom django admin templates not working
- [Django]-Why is logged_out.html not overriding in django registration?
0👍
I wanted to stay with everything as-is out of the box so I just added a User serializer:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['id', 'username']
A Viewset:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
And added to urls:
router.register(r'users', UserViewSet)
- [Django]-How do you dynamically hide form fields in Django?
- [Django]-Add rich text format functionality to django TextField
- [Django]-How to save pillow image object to Django ImageField?
0👍
From DRF Docs:
Note: If using namespacing with hyperlinked serializers you’ll also need to ensure that any view_name parameters on the serializers correctly reflect the namespace. In the examples above you’d need to include a parameter such as view_name=’app_name:user-detail’ for serializer fields hyperlinked to the user detail view.
The automatic view_name generation uses a pattern like %(model_name)-detail. Unless your models names actually clash you may be better off not namespacing your Django REST Framework views when using hyperlinked serializers.
Solution
from rest_framework import serializers
from myapp.models import Post
from django.contrib.auth.models import User
class PostSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="api:post-detail")
author = serializers.HyperlinkedRelatedField(view_name="api:user-detail", read_only=True)
viewers = serializers.HyperlinkedRelatedField(view_name="api:user-detail", read_only=True, many=True)
class Meta:
model = Post
fields = ('id', 'title', 'url', 'author', 'viewers')
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
- [Django]-How can I call a custom Django manage.py command directly from a test driver?
- [Django]-Specifying limit and offset in Django QuerySet wont work
- [Django]-Django models avoid duplicates