簡體   English   中英

Django Rest Framework:可寫的嵌套序列化程序

[英]Django Rest Framework: writable nested serializer

我需要像這樣管理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視圖創建新的Entity時,無法調用ValueSerializer Class的create方法,並且創建的數據如下所示:

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

有人可以幫我嗎?

謝謝!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM