How do i map the "example object" to the url: website.com/api/<user>/<slug>.
I'm getting this
invalid literal for int() with base 10: 'username' error. so i understand that i need to use the user id in-order to map to the object, this is because I am able to map to the object if i use the user_id (integer) (url: website.com/api/<user_id>/<slug>) instead of just the user/username (string).
Is there a way to override the default when mapping to the object from user_id (integer) to another field like user (string)?
Also i don't understand why passing the user instead of user_id in the def get_object in (Api View) does not fix this problem.
Url
urlpatterns = [
url(r'^api/(?P<user>\w+)/(?P<slug>[\w-]+)/$', ExampleDetailAPIView.as_view(), name='example'),
]
Api View
class ExampleDetailAPIView(RetrieveAPIView):
queryset = Example.objects.all()
serializer_class = ExampleDetailSerializer
def get_object(self):
user = self.kwargs.get('user')
slug = self.kwargs.get('slug')
return Example.objects.get(user=user, slug=slug)
def get_serilizer_context(self, *args, **kwargs):
return {'request': self.request}
Serializer
class ExampleDetailSerializer(HyperlinkedModelSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = Example
fields = [
'url',
]
def get_url(self, obj):
request = self.context.get('request')
return obj.get_api_url(request=request)
Model
class Example(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
example_name = models.CharField(max_length=100)
slug = models.SlugField(max_length=100, blank=True)
class Meta:
unique_together = ('user', 'slug')
def get_api_url(self, request=None):
return api_reverse('example-api:example', kwargs={'user': self.user.username, 'slug': self.slug}, request=request)
@receiver(pre_save, sender=Example)
def pre_save_example_slug_receiver(sender, instance, *args, **kwargs):
slug = slugify(instance.example_name)
instance.slug = slug
You can use the username in the url. For that to work you'll have to first find the user manually and then use its id to find the Example object:
def get_object(self):
username = self.kwargs.get('username')
slug = self.kwargs.get('slug')
# find the user
user = User.objects.get(username=username)
return Example.objects.get(user=user.id, slug=slug)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With