3

Je suis nouveau dans Django, donc j'ai quelques problèmes. J'utilise django-rest-framework. Ce sont mes classes de modèle:django-rest-framework ManyToManyField créer et mettre à jour

class Product(models.Model): 
    name = models.CharField(max_length=100) 
    price = models.FloatField() 
    sizes = models.ManyToManyField(Size) 
    ... 
class Size(models.Model): 
    name = models.CharField(max_length=100) 
    ... 

Je voudrais un sérialiseur de produit et un viewset qui permet de créer un produit avec ses tailles. Le sérialiseur écrit ci-dessus permet d'obtenir le produit avec ses tailles mais je ne peux pas créer ou mettre à jour les tailles d'un produit.

Comment puis-je atteindre mon objectif?

+0

vous devez remplacer 'create' dans votre sérialiseur, pour autant que je sache. https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py#L639 –

+0

Ok. Avec OneToOneField c'est très simple, mais avec un ManyToManyField non car il n'y a pas de table croisée. Suis-je obligé de le créer manuellement et de ne pas utiliser ManyToManyField? – fran

Répondre

9

J'ai résolu la création d'un sérialiseur pour obtenir le produit avec des tailles imbriquées, et un sérialiseur pour créer et mettre à jour des produits en utilisant uniquement des identifiants.

class ProductSerializer(serializers.ModelSerializer): 
    sizes = SizeSerializer(many=True) # nested objects 

    class Meta: 
     model = Product 
     fields = ('id', 'name', 'price', 'sizes') 
     read_only_fields = ('id',) 


class ProductCreateUpdateSerializer(serializers.ModelSerializer): 
    # no nested objects, it accepts only size ids 
    class Meta: 
     model = Product 
     fields = ('id', 'name', 'price', 'sizes') 
     read_only_fields = ('id',) 

Il se peut qu'il y ait des changements côté client.

+0

J'ai eu une erreur pour la mise à jour http://stackoverflow.com/questions/40261910/django-rest-many-to-many-model-update-error –