В документации фреймворка Django Rest предлагается явно объявить список «полей», чтобы избежать предоставления данных новых столбцов, просто добавив их в модель, которая может содержать конфиденциальную информацию.
Список полей - это массив строк, содержащий идентификаторы полей. Чтобы избежать объявления идентификаторов полей, которых на самом деле нет в модели (например, опечаток или измененных моделей), я попытался объявить список, используя ссылки на объекты, но всегда получал «DeferredAttribute: объект не имеет атрибута».
Я читал кое-что, что метаинформация недоступна в объектах, и что вы могли бы решить эту проблему, определив свой собственный мета-класс с помощью Object._meta.get_fields () и сохранив его в классе, но я подумал, что есть может быть более простой / элегантный способ (и теперь я знаю, как подробно; -)).
Пример:
class Samples(models.Model):
# Meta data, primarily used in AdminSite.
class Meta:
verbose_name = _('Samples')
verbose_name_plural = _('Samples')
samples_boolfield = models.BooleanField
samples_textfield = models.CharField(max_length=2000, blank=True)
views.py:
class SamplesView(viewsets.ModelViewSet):
serializer_class = SamplesSerializer
queryset = Samples.objects.all()
serializers.py:
Версия 1, которая не показывает никаких ошибок в pyCharm или makemigrations, но вызов API приводит к ошибке «TypeError at / api / samples /: аргумент типа 'DeferredAttribute' равен не повторяется ":
class SamplesSerializer(serializers.ModelSerializer):
class Meta:
model = Samples
fields = (
'id',
Samples.samples_boolfield,
Samples.samples_textfield,
)
Версия 2, которая не показывает никаких ошибок в pyCharm, но makemigrations завершается с ошибкой" DeferredAttribute: объект не имеет атрибута имя":
class SamplesSerializer(serializers.ModelSerializer):
class Meta:
model = Samples
fields = (
'id',
Samples.samples_boolfield.__name__,
Samples.samples_textfield.__name__,
)
Версия 3, которая не показывает никаких ошибок в pyCharm, но makemigrations терпит неудачу с «DeferredAttribute: объект не имеет атрибута get_attname»:
class SamplesSerializer(serializers.ModelSerializer):
class Meta:
model = Samples
fields = (
'id',
Samples.samples_boolfield.get_attname(),
Samples.samples_textfield.get_attname(),
)
Есть ли способ объявить список полей с помощью ссылок на объекты (чтобы он не работал, например, в pyCharm / во время компиляции)?
Спасибо за ваш отзыв.
С уважением, HerrB92