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()
Donc, ici, je veux utiliser tous les champs. Mais j'ai une erreur:
Nom de domaine producer_id
n'est pas valide pour le modèle Car
.
Comment y remédier?
Merci!
Selon le Django REST Framework's Documentation on ModelSerializers :
Par défaut, tous les champs de modèle de la classe seront mappés sur les champs de sérialiseur correspondants.
Ceci est différent de ModelForms de Django , ce qui vous oblige à spécifiez l'attribut spécial '__all__'
pour utiliser tous les champs du modèle. Il suffit donc de déclarer le modèle.
class CarSerializer(ModelSerializer):
class Meta:
model = Car
Le comportement décrit ci-dessus a été déconseillé dans la version 3.3 et interdit depuis la version 3.5.
Il est désormais obligatoire d'utiliser l'attribut spécial '__all__'
pour utiliser tous les champs dans le Django REST Framework, identique à Django Forms:
Ne pas définir les champs ou exclure a déclenché un avertissement de dépréciation en attente dans la version 3.3 et un avertissement de dépréciation en 3.4. Son utilisation est désormais obligatoire.
Alors maintenant ça doit être:
class CarSerializer(ModelSerializer):
class Meta:
model = Car
fields = '__all__'
Vous pouvez utiliser fields = '__all__'
pour obtenir tous vos champs ou vous pouvez spécifier si vous souhaitez renvoyer un nombre limité de champs. Voir documentation .
Mais cela renvoie la valeur id
pour le champ de clé étrangère, c'est-à-dire producer
dans votre cas. Pour obtenir tous les champs pour producer
, vous devez également créer une classe sérialiseur pour cela. Voir ici .
Donc, votre mise à jour serializers.py devrait être:
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', )