gpt4 book ai didi

Django 休息框架 : Access item detail by slug instead of ID

转载 作者:行者123 更新时间:2023-11-28 19:36:08 25 4
gpt4 key购买 nike

是否可以使用对象的 slug(或任何其他字段)来访问项目的详细信息,而不是使用 ID?

例如,如果我有一个带有 slug“lorem”和 ID 1 的项目。默认情况下,URL 是 http://localhost:9999/items/1/。我想通过 http://localhost:9999/items/lorem/ 访问它。

在序列化程序的 Meta 类中添加 lookup_field 不会更改自动生成的 URL,也不会允许我通过手动写入 slug 而不是 URL 中的 ID 来访问该项目。

模型.py

class Item(models.Model):
slug = models.CharField(max_length=100, unique=True)
title = models.CharField(max_length=100, blank=True, default='')
# An arbitrary, user provided, URL
item_url = models.URLField(unique=True)

序列化器.py

class ClassItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Item
fields = ('url', 'slug', 'title', 'item_url')

View .py

class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer

网址.py

router = DefaultRouter()
router.register(r'items', views.ItemViewSet)

urlpatterns = [
url(r'^', include(router.urls)),
]

生成的 JSON:

[
{
"url": "http://localhost:9999/items/1/",
"slug": "lorem",
"title": "Lorem",
"item_url": "http://example.com"
}
]

最佳答案

你应该在你的序列化器中设置lookup_field:

class ItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Item
fields = ('url', 'slug', 'title', 'item_url')
lookup_field = 'slug'
extra_kwargs = {
'url': {'lookup_field': 'slug'}
}

在你看来:

class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
lookup_field = 'slug'

我得到了这个结果:

~ curl http://127.0.0.1:8000/items/testslug/ | python -mjson.tool
{
"item_url": "https://example.com/",
"slug": "testslug",
"title": "Test Title",
"url": "http://127.0.0.1:8000/items/testslug/"
}

关于Django 休息框架 : Access item detail by slug instead of ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32201257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com