检索没有模型的视图集的函数

huangapple go评论135阅读模式
英文:

Retrieve function for viewset without model

问题

I am using object without RDS entry.

  1. class MyDummy(object):
  2. def __init__(self, **kwargs):
  3. for field in ('id', 'detail'):
  4. setattr(self, field, kwargs.get(field, None))
  5. mydummys = {
  6. 1: MyDummy(id=1, detail={"test":"test"}),
  7. 2: MyDummy(id=2, detail={"test2":"test2"})
  8. }

Serializer

  1. class MyDummySerializer(serializers.Serializer):
  2. id = serializers.IntegerField(read_only=True)
  3. detail = serializers.JSONField(allow_null=True)
  4. def create(self, validated_data):
  5. return MyDummy(id=None, **validated_data)
  6. def update(self, instance, validated_data):
  7. for field, value in validated_data.items():
  8. setattr(instance, field, value)
  9. return instance

list function works well for now

  1. class MyDummyViewSet(viewsets.ViewSet):
  2. serializer_class = s.MyDummySerializer
  3. def list(self, request):
  4. serializer = s.MyDummySerializer(
  5. instance=m.mydummys.values(), many=True)
  6. return Response(serializer.data)

However now I want to make retrieve for URL like api/mydummy/1

  1. class MyDummyViewSet(viewsets.ViewSet):
  2. serializer_class = s.MyDummySerializer
  3. def list(self, request):
  4. serializer = s.MyDummySerializer(
  5. instance=m.mydummys.values(), many=True)
  6. return Response(serializer.data)
  7. def retrieve(self, request, pk=None):
  8. serializer = s.MyDummySerializer(
  9. instance=m.mydummys.values(), many=False)
  10. return Response(serializer.data)

It returns,

  1. {
  2. "detail": null
  3. }

I think I should narrow it down by id in retrieve. How can I make it?

英文:

I am using object without RDS entry.

Model

  1. class MyDummy(object):
  2. def __init__(self, **kwargs):
  3. for field in ('id', 'detail'):
  4. setattr(self, field, kwargs.get(field, None))
  5. mydummys = {
  6. 1: MyDummy(id=1, detail={"test":"test"}),
  7. 2: MyDummy(id=2,detail={"test2":"test2"})
  8. }

Serializer

  1. class MyDummySerializer(serializers.Serializer):
  2. id = serializers.IntegerField(read_only=True)
  3. detail = serializers.JSONField(allow_null=True)
  4. def create(self, validated_data):
  5. return MyDummy(id=None, **validated_data)
  6. def update(self, instance, validated_data):
  7. for field, value in validated_data.items():
  8. setattr(instance, field, value)
  9. return instance

list function works well for now

  1. class MyDummyViewSet(viewsets.ViewSet):
  2. serializer_class = s.MyDummySerializer
  3. def list(self, request):
  4. serializer = s.MyDummySerializer(
  5. instance=m.mydummys.values(), many=True)
  6. return Response(serializer.data)

However now I want to make retreive for url like api/mydummy/1

  1. class MyDummyViewSet(viewsets.ViewSet):
  2. serializer_class = s.MyDummySerializer
  3. def list(self, request):
  4. serializer = s.MyDummySerializer(
  5. instance=m.mydummys.values(), many=True)
  6. return Response(serializer.data)
  7. def retrieve(self, request, pk=None):
  8. serializer = s.MyDummySerializer(
  9. instance=m.mydummys.values(), many=False)
  10. return Response(serializer.data)

It returns,

  1. {
  2. "detail": null
  3. }

I think I should narrowing by id in retrieve.

How can I make it ?

答案1

得分: 1

你需要按照字典的键来过滤它,就像这样:

  1. class MyDummyViewSet(viewsets.ViewSet):
  2. # ... 其他列表视图的部分 ...
  3. def retrieve(self, request, pk=None):
  4. instance = m.mydummys.get(int(pk))
  5. if instance is None:
  6. return Response(status=status.HTTP_404_NOT_FOUND)
  7. serializer = s.MyDummySerializer(instance=instance)
  8. return Response(serializer.data)

这将尝试从 mydummys 字典中获取具有键 pkMyDummy 对象。

英文:

You would need to filter it by the key of the dict like this:

  1. class MyDummyViewSet(viewsets.ViewSet):
  2. # ... rest of your list view ...
  3. def retrieve(self, request, pk=None):
  4. instance = m.mydummys.get(int(pk))
  5. if instance is None:
  6. return Response(status=status.HTTP_404_NOT_FOUND)
  7. serializer = s.MyDummySerializer(instance=instance)
  8. return Response(serializer.data)

This would try to get MyDummy object that has a key pk in mydummys dict.

huangapple
  • 本文由 发表于 2023年7月4日 23:08:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/76613917.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定