【问题标题】:What is the easiest way to get custom serialized model with ForeignKey field使用 ForeignKey 字段获取自定义序列化模型的最简单方法是什么
【发布时间】:2014-10-30 11:17:33
【问题描述】:

我正在寻找一种从 Django REST 框架继承 rest_framework.serializers.ModelSerializer 的简单方法,以便它序列化为具有模型类名称和 id 值的外键模型字段的特殊字典,而不仅仅是一个整数/ 首要的关键。这应该适用于不同的模型。

# models.py
class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    book_written_by = models.ForeignKey(Author)

class Song(models.Model):
    song_written_by = models.ForeignKey(Author)

# serializers.py
class CustomSerializer(serializers.ModelSerializer):
    # What to do here? #

class BookSerializer(CustomSerializer):
    class Meta:
        model = Book

class SongSerializer(CustomSerializer):
    class Meta:
        model = Song

我想得到以下结果:

kleist = Author.objects.create(name='Kleist')
some_book = Book.objects.create(author=kleist)
BookSerializer(some_book).data == {'id': 1, 'book_written_by': {'Author': 1}}  # Returns True

我尝试覆盖 get_related_field() 并将 PrimaryKeyRelatedField 更改为 CustomPrimaryKeyRelatedField 并尝试覆盖 to_native() 但我无法访问模型字段及其对象本身,而只能访问 pk 值。

【问题讨论】:

    标签: python django serialization django-models django-rest-framework


    【解决方案1】:

    您需要的当然是可以实现的,但它确实违反了惯例,所以我个人会投票反对这样做。不过,实现所需的一种方法是使用SerializerMethodField

    class BookSerializer(serializers.ModelSerializer):
        book_written_by = serializers.SerializerMethodField('get_author')
    
        class Meta:
            model = User
    
        def get_author(self, obj):
            return {'Author': obj.book_written_by.pk}
    

    这将返回您想要的确切输出。如果您决定遵守约定,我更喜欢这样的输出:

    {'id': 1, 'book_written_by': {'id': 1, 'name': 'somebody'}}
    

    以下序列化程序会为您返回:

    class AuthorSerializer(serializers.ModelSerializer):
        class Meta:
            model = Author
            fields = ('id', 'name')
    
    class BookSerializer(serializers.ModelSerializer):
        book_written_by = AuthorSerializer()
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多