Как получить все экземпляры в поле метода сериализатора - PullRequest
1 голос
/ 28 февраля 2020

Как получить все экземпляры в поле метода сериализатора

У меня есть поле метода сериализатора, и я передаю данные списка в виде контекста сериализатору, как показано ниже.

name_list = [ "abc", "def",....]
obj_list = abc.objects.all() 

Serializer = abcSerializer (obj_list, context=name_list, many=True)

    class abcSerializer (serializers.ModelSerializer):
        xyz = serializers.SerializerMethodField ("getXYZ", read_only=True)

        class Meta:
            model = abc

            def getXYZ (self, data):
                # here I want all instanceses, but I got only one instance in data. 

I хотите прикрепить данные name_list один за другим, чтобы вставить данные с тем же индексом? Как я могу получить все экземпляры в моем поле метода сериализатора?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

После глубокого изучения отладки я понял, что должен поделиться своими результатами с сообществом. Look at the below line:

Serializer = abcSerializer (obj_list, context=name_list, many=True)

Здесь много = True abcSerializer для списка сериализатора, в соответствии с остальные рамки документации в списке сериализатора мы можем получить доступ ко всем объектам набора запросов в методе обновления, как показано ниже

    class BookListSerializer(serializers.ListSerializer):
        def update(self, instance, validated_data):
            # Maps for id->instance and id->data item.
            book_mapping = {book.id: book for book in instance}
            data_mapping = {item['id']: item for item in validated_data}

            # Perform creations and updates.

Я обнаружил, что мы также можем получить доступ ко всем объектам набора запросов любым методом, даже в serializerMethodField , используя синтаксис ниже

def getXYZ (self, data):
    objects = self.instance
0 голосов
/ 28 февраля 2020

Зачем вам нужны все экземпляры? Если вы хотите манипулировать чем-либо во всех случаях, лучше сделайте это, прежде чем передать это в качестве аргумента в Serializer. Если вы хотите получить индивидуальный экземпляр, вы должны получить значение в параметре data. Но ваши отступления не верны. Попробуйте вот так:

class abcSerializer (serializers.ModelSerializer):
    xyz = serializers.SerializerMethodField("getXYZ")

    class Meta:
       model = abc

    def getXYZ(self, data):
       print(data) # it will print a instance of abc
       return value_based_on_data

Обновление

Тогда я думаю, что вам следует попробовать вот так:

Первое обновление сериализатора класса:

class abcSerializer (serializers.ModelSerializer):  # use PascalCase for naming classes
    xyz = serializers.ReadOnlyField()

    class Meta:
        model = abc
        fields = '__all__'   # use PascalCase for naming classes

Тогда используйте следующий код для получения значений xyz:

obj_list = []
for i, item in enumerate(abc.objects.all()):
    item.xyz = name_list[i]
    obj_list.append(item)

abcSerializer(obj_list, many=True).data
...