我有以下型号并指定了primary_key=True
:
class Team(models.Model):
name = models.CharField(
max_length=64,
primary_key=True,
)
... other fields
当我序列化此模型时,我会执行以下操作:
class TeamSerializer(serializers.ModelSerializer):
class Meta:
model = Team
fields = ('url', 'name',) # and another fields
我的观点:
class TeamViewSet(viewsets.ModelViewSet):
lookup_value_regex = '[-\w.]'
queryset = Team.objects.all()
serializer_class = TeamSerializer
filter_fields = ('name',) # and another fields
我的urls.py:
router = routers.DefaultRouter()
router.register(r'teams', TeamViewSet)
urlpatterns = [
url(r'^api/', include(router.urls)),
# I am not sure if this url is right. I repeat of include(router.urls)
url(r'^api/teams/(?P<name>[-\w.]+)/', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
然后,当我创建一个Team
对象,其name
属性包含点.
时,例如 Latinos FC ,我会转到其他网址,我得到:
我不确定如何在我的视图集中使用lookup_value_regex
属性。在this answer中使用了一些基本的正则表达式,但如果我使用它,任何Team
对象都可以通过我的序列化Rest API访问。
如何在序列化/api/teams/Name.F.C.
模型中获取类似于:Team
的网址?
答案 0 :(得分:1)
首先检查你的设置中是否已将APPEND_SLASH设置为True,因为如果没有 - 缺少斜杠(在URL的末尾)是个问题。
第二 - 我不认为点是一个问题,问题可以是空格编码为%20;
第三 - 这样的网址看起来很丑陋:)你应该考虑把它改成某种slu :: Latinos F.C.
- &gt; latinos-fc
;
如果你这样做(只需在模型上添加其他字段 - 这个字段显然应该是唯一的) - 在你的视图上设置lookup_field
- 这将解决你的问题。
考虑一下这个例子:
views.py
class SomeViewSet(viewsets.ModelViewSet):
queryset = SomeModel.objects.all()
serializer_class = SomeSerializer
lookup_field = 'slug_name'
serializers.py
class SomeSerializer(serializers.ModelSerializer):
class Meta:
model = SomeModel
fields = ('id', 'name', 'slug_name')
read_only_fields = ('slug_name',)
def to_internal_value(self, data):
ret = super(SomeSerializer, self).to_internal_value(data)
ret['slug_name'] = slugify(ret['name'])
return ret
models.py
class SomeModel(models.Model):
name = models.CharField(max_length=100)
slug_name = models.SlugField(unique=True, max_length=100)
urls.py
router.register(r'teams', SomeViewSet, base_name='teams')
urlpatterns = router.urls
现在:
创建:
细节:
你能这样做吗?或者你真的需要点?