学习DRF:序列化组中的模型

时间:2016-11-30 18:59:34

标签: 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",
         "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)

serializers.py

class ClassesSerializer(serializers.ModelSerializer):
    class = serializers.StringRelatedField(many=True)

    class Meta:
        model = Classes
        fields = ('classes')

1 个答案:

答案 0 :(得分:3)

您的数据库需要保持表之间的关系。您可以在此处使用foreign key

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)
    related_classes = models.ForeignKey('Classes', on_delete=models.CASCADE, related_name='classes')

    class Meta:
        ordering = ('id',)

class Classes(models.Model):
    nr = models.CharField(max_length=100)

然后,您的序列化器变为:

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关键字冲突。