2

我的序列化程序没有显示相关的模型。我的意思是具有多对一关系的模型。请看下面的代码。原谅我的英语。

完全让我困惑,请帮忙。我是 Django 的新手。我正在尝试将我的 Draft js ContentState 保存到数据库中。我已将 Post 模型作为我的 Block 模型的外键。但是当我尝试使用 django-rest-framework 序列化程序检索数据时,块没有显示。

同样适用于我尝试自行序列化它们的块,但 inlineStyleRanges 和 entityRanges 数据没有出现。

#models.py
class Post(models.Model):
    created_by= models.ForeignKey(User, on_delete=models.CASCADE)
    cat= models.ForeignKey(Category, on_delete=models.CASCADE)

class Block(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    key = models.CharField(max_length=255)
    text = models.TextField()
    type = models.CharField(max_length=90)
    depth = models.IntegerField(default=0)

class InlineStyleRange(models.Model):
    block = models.ForeignKey(Block, on_delete=models.CASCADE)
    offset = models.IntegerField()
    length = models.IntegerField()
    style = models.CharField(max_length=90)

class EntityRange(models.Model):
    block = models.ForeignKey(Block, on_delete=models.CASCADE)
    offset = models.IntegerField()
    length = models.IntegerField()
    key = models.IntegerField()

class Data(models.Model):
    data = models.TextField()

class EntityRangeData(Data):
    enityrange = models.ForeignKey(EntityRange, on_delete=models.CASCADE)

#Entity map here we go


class EntityEntry(models.Model):
    key = models.IntegerField()
    block= models.ForeignKey(Block, on_delete=models.CASCADE)
    type = models.CharField(max_length=90)
    mutability = models.CharField(max_length=90)

class EntityEntryData(Data):
    entityentry = models.ForeignKey(EntityEntry, on_delete=models.CASCADE)

```#Serializers.py```


class EntityEntryDataSerializer(serializers.ModelSerializer):


    class Meta:
        model = models.EntityEntryData
        fields = "__all__"

class EntityEntrySerializer(serializers.ModelSerializer):
    data = EntityEntryDataSerializer()

    class Meta:
        model = models.EntityEntry
        fields = "__all__"


class EntityRangeDataSerializer(serializers.ModelSerializer):


    class Meta:
        model = models.EntityRangeData
        fields = "__all__"


class EntityRangeSerializer(serializers.ModelSerializer):
    data = EntityRangeDataSerializer()

    class Meta:
        model = models.EntityRange
        fields = "__all__"





class InlineStyleRangeSerializer(serializers.ModelSerializer):


    class Meta:
        model = models.InlineStyleRange
        fields = "__all__"


class BlockSerializer(serializers.ModelSerializer):
    inlineStyleRanges = InlineStyleRangeSerializer(many=True, required=False)
    entityRanges = EntityRangeSerializer(many=True, required=False)

    class Meta:
        model = models.Block
        fields = "__all__"





class PostSerializer(serializers.ModelSerializer):
    blocks = BlockSerializer(many=True, required=False, read_only=True)


    class Meta:
        model = models.Post
        fields = "__all__"

输出就像

[
    {
        "id": 1,
        "created_by": 1,
        "cat": 2
    }
]
4

1 回答 1

2

Block模型没有称为inlineStyleRangesor的属性entityRanges,因此您应该related_name在 ForeignKey 字段中使用,或者您可以source在序列化程序中指定一个参数。

inlineStyleRanges = InlineStyleRangeSerializer(many=True, required=False, source='inlinestyle_set')
entityRanges = EntityRangeSerializer(many=True, required=False, source='entityrange_set')

您可能还必须包含两个嵌套的序列化程序BlockSerializer.Meta.fields。代替"__all__",使用列表:

fields = ['id', 'post', 'key', 'inlineStyleRanges', 'entityRanges']
于 2019-07-19T11:54:44.160 回答