2015-01-15 35 views
7

DRF (Django Rest Framework) kullanarak, modellerden biri birincil anahtar olarak bir IP Adresine sahiptir.Django Rest Framework URL'de nokta kullanarak

class VTE(models.Model): 
    ipaddr = models.CharField(primary_key=True, max_length=16) 
    ... 

sorun PK noktalar içerdiğini ve DİNLENME URL monte edildiğinde noktalar yerine birincil anahtar parçası olarak DRF tarafından biçimlendirme seçenekleri olarak yorumlanır. Aşağıdaki hatayı ve eşleşen modelleri inceleyin.

Request URL: http://192.168.10.121/api/vtes/172.25.128.29/ 

Using the URLconf defined in vtfx.urls, Django tried these URL patterns, in this order: 

... 
^api/ ^$ [name='api-root'] 
^api/ ^\.(?P<format>[a-z0-9]+)$ [name='api-root'] 
^api/ ^vtes/$ [name='vte-list'] 
^api/ ^vtes/\.(?P<format>[a-z0-9]+)$ [name='vte-list'] <---- HERE 
^api/ ^vtes/(?P<pk>[^/.]+)/$ [name='vte-detail'] 
^api/ ^vtes/(?P<pk>[^/.]+)/\.(?P<format>[a-z0-9]+)$ [name='vte-detail'] 
... 

birincil anahtarın bir parçası olarak noktalar kullanmak yanlış? Eğer DRF yönlendiricinin URL'leri nasıl birleştirdiği ile uyumlu değil.

Bunu çözmek için DRF yolu var mı?

GÜNCELLEME:

api.py: 
class VTESerializer(serializers.ModelSerializer): 
    class Meta: 
     model = models.VTE 

class VTEViewSet(viewsets.ModelViewSet): 
    queryset = models.VTE.objects.all() 
    serializer_class = VTESerializer 
    permission_classes = (permissions.AllowAny,) 

urls.py: 
router = routers.DefaultRouter() 
router.register(r'vtes', api.VTEViewSet) 

urlpatterns = patterns('', 
    url(r'^api/', include(router.urls)), 
    ... 
) 
+1

: Bu sorunu çözer yeni ViewSet olduğu öncesinde 2.4 için, noktalar, varsayılan lookup_value_regex dahil sağlandı görünüyor Bu trailing_slash, True olarak ayarlandı. – jgiralt

cevap

16

İlk bağlam, bu URL'ler içinde . (nokta) kullanmak Tamam. Can . (period) be part of the path part of an URL?

İkinci Bkz sorun format seçeneğinde ancak varsayılan başına . (nokta) ve / (çizgi) dışlar Birincil anahtar, yakalamak için kullanılan Regex ifadesinde değildi.

(?P<pk>[^/.]+) <--- This excludes the dots in the IP Address 

normal ifade

lookup_value_regex ile ViewSet olarak overrided edilebilir. 2.4'e 2.3.x gelen bir güncelleme sonra bu hatayı görmeye insanlar için bir ipucu olarak

class VTEViewSet(viewsets.ModelViewSet): 
    lookup_value_regex = '[0-9.]+'  #Just add this line & change your Regex if needed 
    queryset = models.VTE.objects.all() 
    serializer_class = VTESerializer 
    permission_classes = (permissions.AllowAny,) 
+1

sizi korusun, ben deli ^^ gitmek için gidiyordum sanıyordum –

İlgili konular