【问题标题】:Circular dependency in serializers序列化程序中的循环依赖
【发布时间】:2014-04-30 17:12:52
【问题描述】:

我玩 django-rest-framework,我会做以下事情:

from rest_framework import serializers

from .models import Author, Book


class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(many=False)

    class Meta:
        model = Book
        fields = ('slug', 'name')


class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer(many=True)

    class Meta:
        model = Author
        fields = ('slug', 'name', 'books')

但它失败了。

NameError at /api/books/authors/
name 'AuthorSerializer' is not defined

有人帮忙吗?

【问题讨论】:

    标签: django api rest django-rest-framework


    【解决方案1】:

    当文件被导入时,它的内容是从上到下执行的。因此author = AuthorSerializer(many=False) 行尝试在定义AuthorSerializer 类之前对其进行实例化。

    即使您可以解决循环依赖问题,这也是糟糕的设计。每当您序列化一个作者时,您都会包含他所有书籍的列表,该列表又包含 Author 对象及其书籍列表。这将导致超出递归深度限制的另一个错误。

    您需要决定在哪个方向保留包含的序列化:您是想要每个书籍序列化中的完整 Author 对象,还是想要包含每个 Author 对象的所有信息的书籍列表?

    然后可以使用任何形式的RelatedField as provided by the Django REST Framework 包含反向关系。

    【讨论】:

      【解决方案2】:

      我知道这个问题已经很老了,但我找到了一个简单的解决方案。

      您需要定义辅助序列化程序以两种方式处理引用:

      class BookUnrelatedSerializer(serializers.ModelSerializer):
          class Meta:
              model = Book
              fields = ('slug', 'name')
      
      
      class AuthorUnrelatedSerializer(serializers.ModelSerializer):
          class Meta:
              model = Author
              fields = ('slug', 'name')
      
      
      class BookSerializer(BookUnrelatedSerializer):
          author = AuthorUnrelatedSerializer()
      
          class Meta(BookUnrelatedSerializer.Meta):
              fields = (*BookUnrelatedSerializer.Meta.fields, 'author')
      
      
      class AuthorSerializer(AuthorUnrelatedSerializer):
          book_set = BookUnrelatedSerializer(many = True)
      
          class Meta(AuthorUnrelatedSerializer.Meta):
              fields = (*AuthorUnrelatedSerializer.Meta.fields, 'book_set')
      

      这样,您可以使用BookSerializerAuthorSerializer,而不会无限循环依赖拥有拥有书籍的作者拥有拥有书籍的作者的书籍...

      【讨论】:

        【解决方案3】:

        一种解决方法是使用 serializers.SerializerMethodField()

        from rest_framework import serializers
        
        from .models import Author, Book
        
        
        class BookSerializer(serializers.ModelSerializer):
            author = serializers.SerializerMethodField()
        
            class Meta:
                model = Book
                fields = ('slug', 'name', 'author')
        
            def get_author(self, obj):
                return AuthorSerializer(obj.author).data
        
        
        class AuthorSerializer(serializers.ModelSerializer):
            books = BookSerializer(many=True)
        
            class Meta:
                model = Author
                fields = ('slug', 'name', 'books')
        

        【讨论】:

          猜你喜欢
          • 2016-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多