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
无效。
如何解决这个问题?
谢谢!
答案 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
上述行为在版本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