Django 学习DRF:在组中序列化模型
我对Django和DRF都是新手。我需要通过GET公开以下JSON,但我似乎很难让每个类成为类[]的一部分。我相信我可以使用StringRelatedField来实现这一点,但我发现的示例似乎并不适合我。提前谢谢 预期产量Django 学习DRF:在组中序列化模型,django,django-rest-framework,Django,Django Rest Framework,我对Django和DRF都是新手。我需要通过GET公开以下JSON,但我似乎很难让每个类成为类[]的一部分。我相信我可以使用StringRelatedField来实现这一点,但我发现的示例似乎并不适合我。提前谢谢 预期产量 { "classes":[ { "id":24, "name":"Math 101", "starts_on":"2016-08-09", "ends_on":"2016-08-14",
{
"classes":[
{
"id":24,
"name":"Math 101",
"starts_on":"2016-08-09",
"ends_on":"2016-08-14",
"entries_url":"https://example.com/classes/24/classes.json"
},
{
"id":23,
"name":"English 101",
"starts_on":"2016-07-28",
"ends_on":"2016-07-30",
"entries_url":"https://example.com/classes/23/classes.json"
}
]
}
这是我拼凑的东西。“nr”只是一个一次性变量,因为除了来自类的数据外,我实际上不需要任何数据
model.py
class Class(models.Model):
id = models.CharField(max_length=10)
starts_on = models.DateTimeField(auto_now_add=False)
ends_on = models.DateTimeField(auto_now_add=False)
entries_url = models.CharField(max_length=150)
class Meta:
ordering = ('id',)
class Classes(models.Model):
nr = models.CharField(max_length=100)
序列化程序.py
class ClassesSerializer(serializers.ModelSerializer):
class = serializers.StringRelatedField(many=True)
class Meta:
model = Classes
fields = ('classes')
数据库需要在表之间保持关系。您可以在此处使用: 然后,序列化程序变为:
class ClassSerializer(serializers.ModelSerializer):
class Meta:
model = Class
fields = ['__all__']
class ClassesSerializer(serializers.ModelSerializer):
classes = ClassSerializer(many=True)
class Meta:
model = Classes
fields = ('classes',)
另外,我强烈建议您对变量使用
class
,因为它与Python的class
关键字冲突。您的模型看起来像什么?您希望输出是什么?更新了考虑不周的模型/序列化程序。Evans:输出是我第一次发布的(JSON)@CareFree您应该小心隐藏内置Python保留字。我会重新考虑将其命名为Class
,这样您就不会意外地对Class
进行阴影处理@CareFree。同时,确保单元组中有一个逗号:字段=('classes',)
。我想我应该让您知道我也在使用POST操作来填充数据库。您上面的代码看起来非常有前途,但是,当然我创建了一个新的DB,当我尝试向其中添加数据时,我得到了“related_classes”:[“此字段是必需的。”如果我在该字段中提交任何内容,它将无法识别PK。您必须使用PrimaryKeyRelatedField
对该字段进行序列化。请查看以开始该操作。
class ClassSerializer(serializers.ModelSerializer):
class Meta:
model = Class
fields = ['__all__']
class ClassesSerializer(serializers.ModelSerializer):
classes = ClassSerializer(many=True)
class Meta:
model = Classes
fields = ('classes',)