ModelSerializer django中的所有字段都是休息框架

tim*_*tim 19 python django django-rest-framework

models.py:

class Car():
    producer = models.ForeignKey(Producer, blank=True, null=True,)
    color = models.CharField()
    car_model = models.CharField()
    doors = models.CharField()
Run Code Online (Sandbox Code Playgroud)

serializers.py:

class CarSerializer(ModelSerializer):

    class Meta:
        model = Car
        fields = Car._meta.get_all_field_names()
Run Code Online (Sandbox Code Playgroud)

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

字段名称producer_id对于模型无效Car.

如何解决?

谢谢!

Mic*_*l B 53

根据Django REST Framework的ModelSerializers文档:

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

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

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car
Run Code Online (Sandbox Code Playgroud)

更新(版本> = 3.5)

上述行为在版本3.3中已弃用,并且自版本3.5以来被禁止.

现在必须使用special属性'__all__'来使用Django REST Framework中的所有字段,与Django Forms相同:

未能设置字段或排除在版本3.3中引发了挂起的弃用警告,并在3.4中引发了弃用警告.它的使用现在是强制性的.

所以现在必须是:

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

  • 如何在模型的所有字段中再添加1个字段? (6认同)
  • @Anuj `fields = (*[f.name for f in MyModel._meta.get_fields()], "another_field") (2认同)

Ven*_*ini 8

您可以使用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', )
Run Code Online (Sandbox Code Playgroud)