How can I modify the Serializer filed of django restframework ModelSerializer when use it in view.py?

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

How can I modify the Serializer filed of django restframework ModelSerializer when use it in view.py?

问题

这是我的DRF序列化器:

  1. class TranMetaSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = TranMeta
  4. fields = "__all__"

当我在view.py中使用序列化器时,我想通过request.GET来更改字段:

  1. @api_view(["GET"])
  2. def getTran_all(request, formar=None):
  3. fields = request.GET.get("fields")
  4. if fields:
  5. fields = fields.split(",")
  6. data = TranMeta.objects.order_by("data_id").values(*fields)
  7. else:
  8. fields = "__all__"
  9. data = TranMeta.objects.all()
  10. serializer = TranMetaSerializer(data, many=True)

但上面的代码会引发一个错误,错误信息是"Field.init() got an unexpected keyword argument 'fields'"。那么我该如何实现我的目标呢?

英文:

This is my DRF serializer:

  1. class TranMetaSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = TranMeta
  4. fields = "__all__"

And when i use the serializer in view.py, i want to change the filed via request.get filed:

  1. @api_view(["GET"])
  2. def getTran_all(request, formar=None):
  3. fields = request.GET.get("fields")
  4. if fields:
  5. fields = fields.split(",")
  6. data = TranMeta.objects.order_by("data_id").values(*fields)
  7. else:
  8. fields = "__all__"
  9. data = TranMeta.objects.all()
  10. serializer = TranMetaSerializer(data, many=True, fields=fields)

But the code above raise an error which says "Field.init() got an unexpected keyword argument 'fields'"
So what can i do to achieve my goal?

答案1

得分: 2

我建议您使用DRF中提供的动态字段序列化器。

  1. class TranMetaSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = TranMeta
  4. fields = "__all__"
  5. def __init__(self, *args, **kwargs):
  6. # 不要将 'fields' 参数传递给超类
  7. fields = kwargs.pop('fields', None)
  8. # 正常实例化超类
  9. super().__init__(*args, **kwargs)
  10. if fields is not None:
  11. # 删除未在 'fields' 参数中指定的任何字段
  12. allowed = set(fields)
  13. existing = set(self.fields)
  14. for field_name in existing - allowed:
  15. self.fields.pop(field_name)
英文:

I recommend you to use a dynamic fields serializer available in DRF

  1. class TranMetaSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = TranMeta
  4. fields = "__all__"
  5. def __init__(self, *args, ***kwargs):
  6. # Don't pass the 'fields' arg up to the superclass
  7. fields = kwargs.pop('fields', None)
  8. # Instantiate the superclass normally
  9. super().__init__(*args, **kwargs)
  10. if fields is not None:
  11. # Drop any fields that are not specified in the `fields` argument.
  12. allowed = set(fields)
  13. existing = set(self.fields)
  14. for field_name in existing - allowed:
  15. self.fields.pop(field_name)

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

发表评论

匿名网友

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

确定