【问题标题】:Serializers not displaying foreign key data序列化程序不显示外键数据
【发布时间】:2019-07-19 11:45:23
【问题描述】:

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

完全让我困惑,请帮忙。我是 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
    }
]

【问题讨论】:

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


    【解决方案1】:

    Block 模型没有称为 inlineStyleRangesentityRanges 的属性,因此您应该在 ForeignKey 字段中使用 related_name 或者您可以在序列化程序中指定 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']
    

    【讨论】:

    • 假设如果我有更多的文件,有没有办法通过__all__ + ['inlineStyleRanges', 'entityRanges']
    猜你喜欢
    • 2021-06-19
    • 2021-10-28
    • 2019-10-06
    • 2015-08-13
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多