Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 基于模型字段值动态创建序列化程序_Django_Django Rest Framework - Fatal编程技术网

Django 基于模型字段值动态创建序列化程序

Django 基于模型字段值动态创建序列化程序,django,django-rest-framework,Django,Django Rest Framework,我有一个这样的模型: class A: name = models.CharField() group = models.ForeignKey('SomeModel', null=True, blank=True) 当我序列化它时,我希望serielizer根据“group”字段是否为空而具有不同的格式。当然,这可以通过为不同的格式使用不同的序列化程序并根据需要在视图层中调用它们来实现: class TypeASerializer(serializers.ModelSerial

我有一个这样的模型:

class A:
    name = models.CharField()
    group = models.ForeignKey('SomeModel', null=True, blank=True)
当我序列化它时,我希望serielizer根据“group”字段是否为空而具有不同的格式。当然,这可以通过为不同的格式使用不同的序列化程序并根据需要在视图层中调用它们来实现:

class TypeASerializer(serializers.ModelSerializer)

    class Meta:
        model = A
        fields = ('id', 'name')

class TypeBSerializer(serializers.ModelSerializer)

    class Meta:
        model = A
        fields = ('id', 'name', 'group')

但我想在序列化程序层本身处理它,并为此使用一个序列化程序。这可能吗?

您可以将序列化程序的每个字段声明为
SerializerMethodField
,如下所示:

class YourSerializer(serializers.ModelSerializer):
    id = serializers.SerializerMethodField()
    name = serializers.SerializerMethodField()
    group = serializers.SerializerMethodField()

    class Meta:
        model = A
        fields = ('id', 'name', 'group')

    def id(self, obj):
        if yourcondition(obj.group):
            return obj.id
        return another_value
    ...

您可以重写序列化程序的get_字段方法

class YourSerializer(serializers.ModelSerializer):
   id = serializers.SerializerMethodField()
   name = serializers.SerializerMethodField()
   group = serializers.SerializerMethodField()

   class Meta:
      model = A
      fields = ('id', 'name', 'group')

   def get_fields(self):
      fields = super().get_fields()
      # delete all the unnecessary fields according to your logic.
      if self.instance.group:  # if this is detials view other wise pass object in context
         del fields['group']
      return fields 

您可以将每个字段声明为SerializerMethodField,并根据您的条件返回值或
None
@vishes\u shell,如果您可以编写答案,这样就不会产生混淆,那就更好了。但这是否仍然包括“group”字段?您能否完成解决方案并包括我在问题中提到的条件?如何在get_字段中使用对象实例中的值?如果你还写下你是如何删除字段并包含逻辑的,那将更有帮助。请检查,我提到了一个条件。是的,但这不是我在问题中所述的条件。另外,您还没有使用我需要知道的对象实例。删除组字段的条件是检查该特定实例的组字段是否为无。您可以演示如何执行此操作吗?另外,我认为应该是:fields=super(YourSerializer,self)。get_fields()您可以从视图在序列化器上下文中传递对象实例,然后您可以在序列化器中访问它,或者如果您在序列化器中传递实例,则可以从self.instance访问它