web-dev-qa-db-fra.com

Tous les champs dans ModelSerializer 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()

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!

18
tim

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

Mise à jour (pour les versions> = 3.5)

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__'
49
Michael B

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', )
4
Venu Saini