ModelSerializer: включает все поля и все свойства модели [duplicate]

Использование .insertAdjacentHTML() сохраняет прослушиватели событий, а поддерживается всеми основными браузерами . Это простая однострочная замена для .innerHTML.

var html_to_insert = "

New paragraph

"; // with .innerHTML, destroys event listeners document.getElementById('mydiv').innerHTML += html_to_insert; // with .insertAdjacentHTML, preserves event listeners document.getElementById('mydiv').insertAdjacentHTML('beforeend', html_to_insert);

Аргумент 'beforeend' указывает, где в элементе для вставки содержимого HTML. Опции: 'beforebegin', 'afterbegin', 'beforeend' и 'afterend'. Их соответствующие местоположения:


Existing content in #mydiv

9
задан Curtwagner1984 7 July 2016 в 12:24
поделиться

5 ответов

Я только что проверил исходный код Django Rest Framework. Поведение, которое вы хотите, по-видимому, не поддерживается в Framework.

Параметр fields должен быть списком, кортежем или текстом __all__.

Вот фрагмент соответствующего исходного кода:

    ALL_FIELDS = '__all__'
    if fields and fields != ALL_FIELDS and not isinstance(fields, (list, tuple)):
        raise TypeError(
            'The `fields` option must be a list or tuple or "__all__". '
            'Got %s.' % type(fields).__name__
        )

Вы не можете добавить «все» дополнительно к кортежу или списку с полями ...

8
ответ дан BigOther 18 August 2018 в 23:45
поделиться

Старая проблема, но подумал, что это может помочь другим в будущем.

Я только что нажал аналогичную проблему и получил параметр «все», указав дополнительное поле вручную в соответствии со следующим пример. Я не уверен, что это также решит вашу проблему. Это проклятое зрелище, чем все, что я видел.

http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = '__all__'

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = '__all__'

Я бы предположил, что это будет работать для любых других связанных опций поля, перечисленных на той же странице: http://www.django-rest-framework.org/api- (/ g1)

Я использую версию Django Rest Framework версии 3.6.2

Пример обратного отношения по запросу:

class TrackSerializer(serializers.ModelSerializer):
    album = AlbumSerializer(source='album_id')

    class Meta:
        model = Track
        fields = '__all__'
3
ответ дан Aiky30 18 August 2018 в 23:45
поделиться
  • 1
    это не сработает в случае обратных отношений - & gt; [Д0] django-rest-framework.org/api-guide/relations/… – Ishan Khare 21 September 2017 в 08:59
  • 2
    @IshanKhare Обновлено, чтобы показать, что это также может работать с обратными отношениями. – Aiky30 25 September 2017 в 15:28
  • 3
    Это должно быть принято в качестве правильного ответа, поскольку оно решает проблему в рамках предоставляемой функциональности структуры без дополнительного взлома. – MrName 7 March 2018 в 18:09

Как и @DanEEStart, DjangoRestFramework не имеет простого способа расширить значение «все» для полей, потому что методы get_field_names, похоже, предназначены для для работы .

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

Я переопределяю этот метод следующим образом:

class ToppingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Topping
        fields = '__all__'
        extra_fields = ['pizzas']

    def get_field_names(self, declared_fields, info):
        expanded_fields = super(ToppingSerializer, self).get_field_names(declared_fields, info)

        if getattr(self.Meta, 'extra_fields', None):
            return expanded_fields + self.Meta.extra_fields
        else:
            return expanded_fields

Обратите внимание, что этот метод только изменяет поведение этого сериализатора, а атрибут extra_fields работает только с этим классом сериализатора.

Если у вас есть тонна сериализатора, подобная этому, вы можете создать промежуточный класс для включения этого метода get_fields_names в одном месте и повторного использования много раз. Некоторым это нравится:

class CustomSerializer(serializers.HyperlinkedModelSerializer):

    def get_field_names(self, declared_fields, info):
        expanded_fields = super(CustomSerializer, self).get_field_names(declared_fields, info)

        if getattr(self.Meta, 'extra_fields', None):
            return expanded_fields + self.Meta.extra_fields
        else:
            return expanded_fields


class ToppingSerializer(CustomSerializer):

    class Meta:
        model = Topping
        fields = '__all__'
        extra_fields = ['pizzas']

class AnotherSerializer(CustomSerializer):

    class Meta:
        model = Post
        fields = '__all__'
        extra_fields = ['comments']
15
ответ дан hugoruscitti 18 August 2018 в 23:45
поделиться
  • 1
    Я просто хочу сообщить вам, что вы - спасатель, и большое спасибо за этот фрагмент. – Hondros 12 July 2017 в 02:26

, чтобы включить все поля и другие поля, определенные в вашем сериализаторе, вы можете просто сказать exclude = ()

class ToppingSerializer(serializers.HyperlinkedModelSerializer):
   pizzas = '<>' #the extra attribute value
    class Meta:
        model = Topping
        exclude = ()

. Здесь будут перечислены все значения полей с дополнительным аргументом pizzas

1
ответ дан riyasyash 18 August 2018 в 23:45
поделиться

Привет, я мог бы достичь ожидаемого результата, используя Django _meta API , который, кажется, доступен с Django 1.11. Поэтому в моем сериализаторе я сделал:

model = MyModel
fields = [field.name for field in model._meta.fields]
fields.append('any_other_field')

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

Приветствия!

1
ответ дан Wand 18 August 2018 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: