如何使用 ModelSerializer 显示所有模型字段?

Posted

技术标签:

【中文标题】如何使用 ModelSerializer 显示所有模型字段?【英文标题】:How to display all model fields with ModelSerializer? 【发布时间】:2015-07-28 06:27:02 【问题描述】:

models.py

class Car():
    producer = models.ForeignKey(Producer, blank=True, null=True,)
    color = models.CharField()
    car_model = models.CharField()
    doors = models.CharField()

serializers.py

class CarSerializer(ModelSerializer):

    class Meta:
        model = Car
        fields = Car._meta.get_all_field_names()

所以,我想在这里使用所有字段。但我有一个错误:

字段名称producer_id 对模型Car 无效。

如何解决这个问题?

谢谢!

【问题讨论】:

能否在您的问题中包含此错误的回溯? 【参考方案1】:

根据Django REST Framework's Documentation on ModelSerializers:

默认情况下,类上的所有模型字段都会映射到对应的序列化器字段。

这与Django's ModelForms 不同,后者需要您specify the special attribute '__all__' 才能使用所有模型字段。因此,只需声明模型即可。

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car

更新(版本 >= 3.5)

上述行为在 3.3 版中已被弃用,自 3.5 版起被禁止。

It is now mandatory 使用特殊属性 '__all__' 使用 Django REST Framework 中的所有字段,与 Django Forms 相同:

未能设置字段或排除在 3.3 版中引发了待决弃用警告,并在 3.4 中引发了弃用警告。它现在是强制性的。

所以现在它必须是:

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car
        fields = '__all__'

【讨论】:

如何在模型的所有字段中再增加1个字段? @Anuj `fields = (*[f.name for f in MyModel._meta.get_fields()], "another_field")【参考方案2】:

您可以使用fields = '__all__' 获取所有字段,或者您可以指定是否要返回有限数量的字段。见documentation。

但这会返回外键字段的 id 值,即在您的情况下为 producer。要获取producer 的所有字段,您还需要为此创建一个序列化程序类。见here。

所以您更新后的 serializers.py 应该是:

class ProducerSerializer(ModelSerializer):
    class Meta:
        model = Producer

class CarSerializer(ModelSerializer):
    producer= ProducerSerializer(read_only=True)

    class Meta:
        model = Car
        fields = ('producer', 'color', 'car_model', 'doors', )

【讨论】:

【参考方案3】:

如果您希望所有字段都包含在序列化程序中,您可以使用 fields ='_ all _'

class CarSerializer(serializer.ModelSerializer):
      class Meta:
           fields = '__all__'
           model = Car

但不推荐这种方法。我们应该始终明确指定所有字段。这是因为它使我们能够控制显示的字段。如果我们不想显示字段数据,我们可以避免这种情况。

 class CarSerializer(serializer.ModelSerializer):
          class Meta:
               fields = ['name','color','company','price']
               model = Car

【讨论】:

以上是关于如何使用 ModelSerializer 显示所有模型字段?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架,如何在 ModelSerializer 中包含“__all__”字段和相关字段?

Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

带有 ImageFIeld 和 HTTPS 的 Django ModelSerializer

(生鲜项目)08. ModelSerializer 实现商品列表页, 使用Mixin来实现返回, 以及更加方便的ListAPIView, 以及分页的设置

如何保存具有关系的modelSerializer? - django

Django Rest Framework - 如何在 ModelSerializer 中添加自定义字段