Django-rest-framework 多个 url 参数

laa*_*laa 1 python django rest django-rest-framework

我如何将“示例对象”映射到 url: website.com/api/<user>/<slug>

我收到这个
invalid literal for int() with base 10: 'username'错误。所以我知道我需要使用用户 ID 才能映射到对象,这是因为如果我使用 user_id(整数)(url:)website.com/api/<user_id>/<slug>而不是用户/用户名,我就可以映射到对象(细绳)。

当映射到对象从 user_id(整数)到另一个字段(如用户(字符串))时,有没有办法覆盖默认值?

我也不明白为什么def get_object在(Api 视图)中传递用户而不是 user_id不能解决这个问题。

网址

urlpatterns = [
    url(r'^api/(?P<user>\w+)/(?P<slug>[\w-]+)/$', ExampleDetailAPIView.as_view(), name='example'),
]
Run Code Online (Sandbox Code Playgroud)

接口视图

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}
Run Code Online (Sandbox Code Playgroud)

序列化器

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)
Run Code Online (Sandbox Code Playgroud)

模型

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
Run Code Online (Sandbox Code Playgroud)

xyr*_*res 5

您可以username在网址中使用 。为此,您必须首先手动找到用户,然后使用它id来查找Example对象:

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)
Run Code Online (Sandbox Code Playgroud)