41

模型.py

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

序列化程序.py

class CarSerializer(ModelSerializer):

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

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

字段名称producer_id对模型无效Car

如何解决?

谢谢!

4

3 回答 3

96

根据Django REST Framework 的有关 ModelSerializers 的文档

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

这与Django 的 ModelForms不同,后者要求您指定特殊属性'__all__'以利用所有模型字段。因此,只需声明模型即可。

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

更新(对于 >= 3.5 的版本)

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

现在必须使用特殊属性'__all__'来使用 Django REST 框架中的所有字段,与 Django 表单相同:

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

所以现在它必须是:

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car
        fields = '__all__'
于 2015-05-16T16:10:54.153 回答
9

您可以使用fields = '__all__'来获取所有字段,也可以指定是否要返回有限数量的字段。请参阅文档

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

所以你更新的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', )
于 2016-08-25T06:19:05.120 回答
0

如果您希望所有字段都包含在序列化程序中,您可以使用 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
于 2021-04-16T12:30:43.730 回答