英文:
How can I modify the Serializer filed of django restframework ModelSerializer when use it in view.py?
问题
这是我的DRF序列化器:
class TranMetaSerializer(serializers.ModelSerializer):
    class Meta:
        model = TranMeta
        fields = "__all__"
当我在view.py中使用序列化器时,我想通过request.GET来更改字段:
@api_view(["GET"])
def getTran_all(request, formar=None):
    fields = request.GET.get("fields")
    if fields:
        fields = fields.split(",")
        data = TranMeta.objects.order_by("data_id").values(*fields)
    else:
        fields = "__all__"
        data = TranMeta.objects.all()
    serializer = TranMetaSerializer(data, many=True)
但上面的代码会引发一个错误,错误信息是"Field.init() got an unexpected keyword argument 'fields'"。那么我该如何实现我的目标呢?
英文:
This is my DRF serializer:
class TranMetaSerializer(serializers.ModelSerializer):
  class Meta:
    model = TranMeta
    fields = "__all__"
And when i use the serializer in view.py, i want to change the filed via request.get filed:
@api_view(["GET"])
def getTran_all(request, formar=None):
    fields = request.GET.get("fields")
    if fields:
        fields = fields.split(",")
        data = TranMeta.objects.order_by("data_id").values(*fields)
    else:
        fields = "__all__"
        data = TranMeta.objects.all()
    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中提供的动态字段序列化器。
class TranMetaSerializer(serializers.ModelSerializer):
    class Meta:
        model = TranMeta
        fields = "__all__"
    def __init__(self, *args, **kwargs):
        # 不要将 'fields' 参数传递给超类
        fields = kwargs.pop('fields', None)
        # 正常实例化超类
        super().__init__(*args, **kwargs)
        if fields is not None:
            # 删除未在 'fields' 参数中指定的任何字段
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)
英文:
I recommend you to use a dynamic fields serializer available in DRF
class TranMetaSerializer(serializers.ModelSerializer):
  class Meta:
    model = TranMeta
    fields = "__all__"
  def __init__(self, *args, ***kwargs):
    # Don't pass the 'fields' arg up to the superclass
    fields = kwargs.pop('fields', None)
    # Instantiate the superclass normally
    super().__init__(*args, **kwargs)
    if fields is not None:
        # Drop any fields that are not specified in the `fields` argument.
        allowed = set(fields)
        existing = set(self.fields)
        for field_name in existing - allowed:
            self.fields.pop(field_name)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论