Django Rest Framework:可写嵌套序列化器

时间:2017-04-28 08:08:29

标签: django django-rest-framework

我需要像这样管理一个JSON:

{
  "name": "drink_type",
  "description": "A type of drink",
  "values": [
    {
      "value": "Coca-Cola",
      "synonyms": [
        "coca cola",
        "coke"
      ]
    },
    {
      "value": "Beer",
      "synonyms": [
        "beer"
      ]
    }
  ]
}

models.py:

class Entity(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)

class Value(models.Model):
    entity = models.ForeignKey(Entity, related_name='values', on_delete=models.CASCADE)
    value = models.CharField(max_length=50)
    created = models.DateTimeField(auto_now_add=True)

class Synonymous(models.Model):
    value = models.ForeignKey(Value, related_name='synonyms', on_delete=models.CASCADE)
    synonymous = models.CharField(max_length=50)
    created = models.DateTimeField(auto_now_add=True)

serializers.py:

class ValueSerializer(serializers.ModelSerializer):
    synonyms = serializers.SlugRelatedField(
        many=True,
        slug_field='synonymous',
        queryset=Synonymous.objects.all()
        )

    class Meta:
        model = Value
        fields = ('value', 'synonyms')

    def create(self, validated_data):
        synonyms_data = validated_data.pop('synonyms')
        value = Value.objects.create(**validated_data)
        for synonyomous_data in synonyms_data:
            Synonymous.objects.create(value=value, **synonyomous_data)
        return value

class EntitySerializer(serializers.ModelSerializer):
    values = ValueSerializer(many=True)

    class Meta:
        model = Entity
        fields = ('id', 'name', 'description', 'values')

    def create(self, validated_data):
        values_data = validated_data.pop('values')
        entity = Entity.objects.create(**validated_data)
        for value_data in values_data:
            # How can I call the create method of values?
            pass
        return entity

views.py

@api_view(['GET', 'POST'])
def entity_list(request, format=None):
    """
    List all entities, or create a new entity.
    """
    if request.method == 'GET':
        entities = Entity.objects.all()
        serializer = EntitySerializer(entities, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = EntitySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在调用GET视图时,序列化程序工作正常,但是当我尝试使用POST视图创建新实体时,我无法调用ValueSerializer类的create方法,并且创建的数据如下所示: / p>

{
    "name": "drink_type",
    "description": "A type of drink",
    "values": []
}

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

class SynonymousSerializer(serializers.ModelSerializer):
    class Meta:
        model = Synonymous
        fields = '__all__'

class ValueSerializer(serializers.ModelSerializer):
    entity = serializers.PrimaryKeyRelatedField(queryset = Entity.objects.all())
    synonyms = ValueSerializer(many=True)
    class Meta:
        model = Value
        fields = ('id', 'synonyms')


class EntitySerializer(serializers.ModelSerializer):
    values = ValueSerializer(many=True)
    class Meta:
        model = Entity
        fields = ('id','values')


q = Entity.objects.all()
serializer = EntitySerializer(q)

print serializer.data