Django - размещение в теле запроса дополнительных данных из сериализатора drf

Мне нужно, чтобы пользователь прислал мне данные в таком формате. Каждый элемент в "данных", маст содержит "mandatory_key" и они могут дополнительно отправить любые другие ключи, которые они хотят.

{
    "data": [
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... }
    ]
}

поскольку "mandatory_key" - единственный ключ, который я знаю, я могу сделать свой сериализатор следующим образом.

class MySerializer(Serializer):
    mandatory_key = CharField()

Когда я инициирую этот сериализатор с атрибутом data, в validated_data он выдает только mandatory_key, а не другие ключи.

serializer = MySerializer(data=request.data)
if serializer.is_valid():
    print(serializer.validated_data)

Есть ли способ сделать это с помощью сериализатора? Я не хочу проверять его вручную. Потому что сценарий использования намного отличается. Спасибо!

Поскольку один ключ, который вы получаете, является обязательным, а остальные могут быть blank=True и null=True в модели, вы можете просто сделать следующее:

from rest_framework import serializers

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = "__all__"

Это должно работать, но, пожалуйста, убедитесь, что другие поля модели не являются обязательными, когда вы определяете их внутри модели

Сначала вам нужно использовать пользовательский create () или update() в вашем сериализаторе, затем вы можете найти дополнительные поля, обратившись к контекстным данным. Например, вы можете получить все доступные поля, сделав следующее:

def create(self, validated_data):
   fields = self.context["request"].data

Вы получите объект, который показывает все поля, которые были отправлены из запроса. Вы не можете получить данные из дополнительных полей из объекта validate_data, потому что они не являются частью вашего сериализатора, поэтому не могут быть автоматически проверены

Вернуться на верх