Django Rest框架:从模型定义中获取字段名

2024-06-28 19:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django Rest框架文档中,建议显式声明“字段”列表,以避免仅通过将新列添加到可能包含敏感信息的模型中来提供新列的数据

字段列表是一个字符串数组,包含字段ID。为了避免声明字段ID,而字段ID实际上并不存在于模型中(例如,输入错误或更改的模型),我尝试使用对象引用来声明列表,但总是以“DeferredAttribute:object has no attribute”结束

我读过一些东西,元信息在对象中是不可用的,您可以通过使用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中未显示任何错误,但在“TypeError at/API/samples/:类型为'DeferredAttribute'的参数不适用”中调用API reults:

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


Tags: 对象name声明fields列表get错误meta