使用Django REST框架时,如何在序列化程序嵌套时排除父级?

2024-09-30 14:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我觉得这可能是在文件里,但我好像不明白。在

如果我有一个序列化程序,它的fields中包含ForeignKey,那么当序列化程序嵌套在相关对象中时,如何排除该FK?在

class EmployerSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Employer
        fields = ('name', 'person')

class PersonSerializer(serializers.HyperlinkedModelSerializer):
    employers = EmployerSerializer()

    class Meta:
        model = Person
        fields = ('name', 'employers')
        depth = 1

当我点击http://0.0.0.0:8000/person/1/的API时,它会列出如下内容:

^{pr2}$

“雇主”的“person”键是自引用和冗余的,但仅当序列化程序嵌套在它所引用的对象中时。在

当序列化程序嵌套时,似乎应该有一个排除它的选项,但是我想不出来。在


Tags: 文件对象name程序fieldsmodel序列化meta
1条回答
网友
1楼 · 发布于 2024-09-30 14:28:01
class DynamicFieldsModelSerializer(serializers.HyperlinkedModelSerializer):
    """
    A HyperlinkedModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)
        exclude = kwargs.pop('exclude', None)
        # Instantiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)
        if exclude:
            # Drop fields that are specified in the `exclude` argument.
            excluded = set(exclude)
            for field_name in excluded:
                try:
                    self.fields.pop(field_name)
                except KeyError:
                    pass

使用DynamicFieldsModelSerializer扩展EmployerSerializer

^{pr2}$

相关问题 更多 >