将详细API视图设置为str而不是Django的pk

时间:2018-10-26 13:01:20

标签: python django api django-rest-framework

我已经将我的API列表视图设置为url'api /',并且我想将详细信息(RetrieveAPI)视图从url'api /'pk'/'更改为'api /'name'/名称是我模型中的一个字段。

我尝试了

的各种组合
lookup_url_kwarg = 'name'

lookup_field = 'name'
在我的serializers.py和views.py中都

,但是我得到404响应,或者URL仍然是api //。另外,如果该字段是字符串,我是否必须在URL中包括引号?任何见识都会很棒!

serializer.py:

    class CountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Country
        fields =('name', 'topLevelDomain', 'alpha2Code', 'alpha3Code', 'callingCodes',
             'capital', 'altSpellings', 'region', 'subregion', 'population', 'latlng',
             'demonym', 'timezones', 'borders', 'nativeName', 'numericCode',
             'currencies', 'translations', 'flag', 'regionalBlocs', 'cioc')
        lookup_field = 'name'

views.py:

class CountryListView(ListAPIView):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer


class CountryDetailView(RetrieveAPIView):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
    #lookup_url_kwarg = 'name'

url.py:

urlpatterns = [
    path('', CountryListView.as_view()),
    path('<name>/', CountryDetailView.as_view())
]

1 个答案:

答案 0 :(得分:0)

您应该使用lookup_field。验证/api/是否显示国家/地区列表。然后尝试/api/<country_name>/,其中country_name是Country实例之一的名称。

class CountryDetailView(RetrieveAPIView):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
    lookup_field = 'name'

class CountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Country
        ...
        lookup_field = 'name'