【问题标题】:Django Rest Framework: writable nested serializerDjango Rest Framework:可写嵌套序列化器
【发布时间】:2017-04-28 08:08:29
【问题描述】:

我需要像这样管理 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 方法,创建的数据如下:

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

有人可以帮助我吗?

谢谢!

【问题讨论】:

  • 你尝试了什么?这里有什么问题?
  • 如何访问create 类的create 方法?我曾尝试调用self.values.create(value_data),但 Django 向我返回以下错误:“EntitySerializer”对象没有属性“值”。一般来说,我不了解管理多嵌套 JSON 的库的逻辑。

标签: django django-rest-framework


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2017-07-28
    相关资源
    最近更新 更多