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

时间:2015-05-16 10:37:04

标签: python django django-rest-framework

models.py

<a class="show_hide" href="#" rel="#slidingDiv">View</a></pre>
<div id="slidingDiv" class="toggleDiv" style="display: none;">Content</div>

serializers.py

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

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

字段名class CarSerializer(ModelSerializer): class Meta: model = Car fields = Car._meta.get_all_field_names() 对模型producer_id无效。

如何解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:43)

根据Django REST Framework's Documentation on ModelSerializers

  

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

这与Django's ModelForms不同,specify the special attribute '__all__'要求您It is now mandatory使用所有模型字段。因此,所有必要的是声明模型。

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

更新(版本&gt; = 3.5)

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

hook使用特殊属性'__all__'来使用Django REST Framework中的所有字段,与Django Forms相同:

  

无法设置任何字段或排除在版本3.3中引发了待处理的弃用警告,并在3.4中引发了弃用警告。它的使用现在是强制性的。

现在一定是:

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

答案 1 :(得分: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', )

答案 2 :(得分: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