Django Rest Framework: получить имя поля из определения модели - PullRequest
0 голосов
/ 17 июня 2020

В документации фреймворка 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

...