È possibile utilizzare lo slug di un oggetto (o qualsiasi altro campo) per accedere ai dettagli di un oggetto, invece di utilizzare l'ID?Django Rest Framework: accedi al dettaglio dell'oggetto tramite slug invece dell'ID
Ad esempio, se si dispone di un elemento con lo slug "lorem" e ID 1. Per impostazione predefinita l'URL è http://localhost:9999/items/1/
. Voglio accedervi tramite http://localhost:9999/items/lorem/
invece.
L'aggiunta di lookup_field
nella classe Meta del serializzatore non ha fatto nulla per modificare l'URL generato automaticamente né mi ha consentito di accedere all'elemento scrivendo manualmente lo slug anziché l'ID nell'URL.
models.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)
serializers.py
class ClassItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Item
fields = ('url', 'slug', 'title', 'item_url')
views.py
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
urls.py
router = DefaultRouter()
router.register(r'items', views.ItemViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
JSON Generated:
[
{
"url": "http://localhost:9999/items/1/",
"slug": "lorem",
"title": "Lorem",
"item_url": "http://example.com"
}
]
Non c'è tempo per una risposta completa, ma si possono trovare quello che stai cercando per il [pagina di router Documenti per DRF] (http: //www.django-rest-framework .org/api-guida/router/# simplerouter). In particolare, nella parte inferiore della sezione collegata per 'SimpleRouter', guarda l'esempio con' classe MyModelViewSet'. Penso che questo ti permetta di cambiare il valore di ricerca in qualunque cosa tu voglia. Potrebbe essere un buon punto di partenza. – eykanal
Notate che state usando 'DefaultRouter', non' SimpleRouter' ... Non sono sicuro quale sia questa funzionalità in entrambe le classi. – eykanal