Использование .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
Я только что проверил исходный код 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__
)
Вы не можете добавить «все» дополнительно к кортежу или списку с полями ...
Старая проблема, но подумал, что это может помочь другим в будущем.
Я только что нажал аналогичную проблему и получил параметр «все», указав дополнительное поле вручную в соответствии со следующим пример. Я не уверен, что это также решит вашу проблему. Это проклятое зрелище, чем все, что я видел.
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__'
Как и @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']
, чтобы включить все поля и другие поля, определенные в вашем сериализаторе, вы можете просто сказать exclude = ()
class ToppingSerializer(serializers.HyperlinkedModelSerializer):
pizzas = '<>' #the extra attribute value
class Meta:
model = Topping
exclude = ()
. Здесь будут перечислены все значения полей с дополнительным аргументом pizzas
Привет, я мог бы достичь ожидаемого результата, используя Django _meta API , который, кажется, доступен с Django 1.11. Поэтому в моем сериализаторе я сделал:
model = MyModel
fields = [field.name for field in model._meta.fields]
fields.append('any_other_field')
В программировании всегда есть много способов добиться того же результата, но это выше, действительно сработало для меня.
Приветствия!