如何序列化文件以创建通过外键连接的模型。 Django Rest框架

时间:2019-11-13 18:04:51

标签: django django-rest-framework

我有几个文件“ ABC”,每个文件都有包含不同数据的多个部分。另外,我还有一个解析器,用于将该文件解析为dict格式:

{part1: {"name":"test name", 
         "dataKey1":"i have a model for this key", 
         "dataKey2":{"a":123, "b":222}},
 part2: {"name":"test name 2", 
         "dataKey1":"not empty string", 
         "dataKey2":{"a":080, "b":999}}
}

我有一个用于嵌套字典中某些键的模型。 我在文件中有一些键的模型。 我有一个文件模型。 我有一个用于保存所有文件列表的模型。

序列化器如何处理许多文件(我随请求获得)的结构,每个文件都将用我的函数进行解析并序列化以不仅为每个文件而且为每个所需的嵌套字典创建模型。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Hei Alex,

让我们看一下问答模型。

首先,具有单个属性的问题即问题本身的文本。我们可能对文字有疑问,“月亮是球体吗?”

class Question(models.Model):
    question = models.TextField()

第二,我们有一个答案。答案与问题有关。例如,我们可以有两个答案“ True”和“ False”,并且都将上述问题作为其外键。

class Answer(models.Model):
    answer = models.TextField()
    question = models.ForeignKey(Question, related_name='answer', on_delete=models.CASCADE)

上面要注意的关键事项之一是ForeignKey上的related_name='answer'。除其他外,这使我们能够在查询Answers时获取相关的Question

NB 。如果您向模型添加related_name,则必须迁移所做的更改。

让我们看看如何使用DRF的序列化器来做到这一点。

class AnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answer
        fields = ('id', 'answer', 'question')


class QuestionSerializer(serializers.ModelSerializer):
    answer = AnswerSerializer(many=True, read_only=True)

    class Meta:
        model = Question
        fields = ['id', 'question', 'answers']

AnswerSerializer非常简单,因为我们完全序列化了模型Answer,就像它出现在其自己的模型类中一样。

QuestionSerializer使我们成为在“应答”模式下设置的related_name。在这里,我们可以定义要序列化的其他属性:答案。

由于我们有一个从AnswerQuestion的外键,且已定义related_name,因此我们可以将此相关名称用作相关模型的ModelSerializer中的字段。

您可能已经注意到related_nameanswer,并且与我们在QuestionSerializer中使用的名称相同。

使用如上所述的逻辑,您将能够像在此所做的那样构建嵌套的序列化器,并通过在关系中使用related_name属性,可以在序列化器中添加相关字段。

祝你好运!