gpt4 book ai didi

python - django rest framework 在列表显示中隐藏特定字段?

转载 作者:太空狗 更新时间:2023-10-29 21:54:36 27 4
gpt4 key购买 nike

I want to hide specific fields of a model on the list display at persons/ and show all the fields on the detail display persons/jane

我对 rest 框架比较陌生,文档感觉很难掌握。

这是我想要完成的。

我有一个简单的 Person模型,

# model
class Person(models.Model):
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
nickname = models.CharField(max_length=20)
slug = models.SlugField()
address = models.TextField(max_length=300, blank=True)

和序列化器类

# serializers

class PersonListSerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = ('nickname', 'slug')


class PersonSerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = ('first_name', 'last_name', 'nickname', 'slug', 'address')

和 View 集。

# view sets (api.py)

class PersonListViewSet(viewsets.ModelViewSet):
queryset = Person.objects.all()
serializer_class = PersonListSerializer


class PersonViewSet(viewsets.ModelViewSet):
queryset = Person.objects.all()
serializer_class = PersonSerializer

在 url persons 我想显示人员列表,只显示字段 nicknameslug在网址 persons/[slug] 我想显示模型的所有字段。

我的路由器配置,

router = routers.DefaultRouter()
router.register(r'persons', api.PersonListViewSet)
router.register(r'persons/{slug}', api.PersonViewSet)

我猜第二个配置是错误的,我怎样才能实现我想要做的?

更新:

输出到 persons/slug {"detail":"Not found."}但它适用于 person/pk

谢谢

最佳答案

对于遇到此问题的任何其他人,我发现在 View 集上重写 get_serializer_class 并为每个操作定义一个序列化程序是 DRY-est 选项(保留单个 View 集但允许动态序列化程序选择):

class MyViewset(viewsets.ModelViewSet):
serializer_class = serializers.ListSerializer
permission_classes = [permissions.IsAdminUser]
renderer_classes = (renderers.AdminRenderer,)
queryset = models.MyModel.objects.all().order_by('-updated')

def __init__(self, *args, **kwargs):
super(MyViewset, self).__init__(*args, **kwargs)
self.serializer_action_classes = {
'list':serializers.AdminListSerializer,
'create':serializers.AdminCreateSerializer,
'retrieve':serializers.AdminRetrieveSerializer,
'update':serializers.AdminUpdateSerializer,
'partial_update':serializers.AdminUpdateSerializer,
'destroy':serializers.AdminRetrieveSerializer,
}

def get_serializer_class(self, *args, **kwargs):
"""Instantiate the list of serializers per action from class attribute (must be defined)."""
kwargs['partial'] = True
try:
return self.serializer_action_classes[self.action]
except (KeyError, AttributeError):
return super(MyViewset, self).get_serializer_class()

希望这对其他人有帮助。

关于python - django rest framework 在列表显示中隐藏特定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com