2015-01-15 22 views
7

में डॉट का उपयोग कर डीआरएफ (Django बाकी फ्रेमवर्क) मेरी मॉडलों में से एक का उपयोग प्राथमिक कुंजी के रूप में एक आईपी पता है।Django बाकी फ्रेमवर्क यूआरएल

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

समस्या यह है कि पी डॉट्स शामिल है, और जब बाकी यूआरएल इकट्ठे है डॉट्स के बजाय प्राथमिक कुंजी के हिस्से के रूप डीआरएफ द्वारा स्वरूपण विकल्प के रूप में व्याख्या कर रहे हैं। नीचे दी गई त्रुटि और मिलान पैटर्न देखें।

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'] 
... 

यह प्राथमिक कुंजी के हिस्से के रूप डॉट्स का उपयोग करने के लिए गलत क्या है? यदि नहीं यह एक तरह कैसे डीआरएफ रूटर विधानसभा यूआरएल के साथ की असंगत है।

वहाँ कि हल करने के लिए एक डीआरएफ रास्ता नहीं है?

अद्यतन: संदर्भ

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

2,4 करने के लिए 2.3.x से एक अपडेट के बाद यह त्रुटि देख लोगों के लिए एक संकेत के रूप में: इस नए ViewSet कि समस्या का हल है ऐसा लगता है कि पहले 2.4 करने के लिए, डॉट्स डिफ़ॉल्ट lookup_value_regex में है, बशर्ते शामिल थे कि trailing_slash सही पर सेट किया गया था। – jgiralt

उत्तर

16

सबसे पहले, यह यूआरएल में . (डॉट) का उपयोग करने के ठीक है। देखें Can . (period) be part of the path part of an URL?

दूसरा, समस्या format विकल्प में लेकिन Regex प्राथमिक कुंजी है, जो शामिल नहीं . (डॉट) और / (स्लैश) डिफ़ॉल्ट प्रति पकड़ने के लिए इस्तेमाल किया अभिव्यक्ति में नहीं था।

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

regex lookup_value_regex साथ ViewSet में overrided जा सकता है।

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

आपका भला करे, मैंने सोचा कि मैं पागल हो जा रहा था ^^ –

संबंधित मुद्दे