2016-09-08 11 views
0

Django Rest Frameworkを使用して、HyperlinkedRelatedFieldをDjangoのManyToManyFieldに接続し、HyperlinkedRelatedFieldデータを無視する正常なPUT(ステータス200)を更新しようとしています。私は明らかに何かを欠いているが、何?コマンドラインからhttpieを使用して例えばDjango Rest FrameworkでHyperlinkedRelatedFieldを更新する方法

#models.py 

class Product(models.Model): 

    name = models.CharField(_('Name'),) 
    number = models.IntegerField(_('Number'),) 
    slug = models.SlugField(_('Slug'),) 


class UserPrefs(models.Model): 

    other_prefs = models.CharField(_('Other Prefs')) 
    favorite_products = models.ManyToManyField(
     Product, 
     blank = True) 


#views.py 

class UserPrefsViewSet(viewsets.ModelViewSet): 

    permission_classes = (
     permissions.IsAuthenticated, 
    ) 
    serializer_class = UserPrefsSerializer 

    def get_queryset(self): 
     user = self.request.user 
     return UserPrefs.objects.filter(user=user) 


#serializers.py  

class ProductSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Product 
     fields = (
      'url', 
      'name', 
      'number', 
      'slug', 
      ) 

     extra_kwargs = { 
      'url': {'lookup_field': 'slug'} 
     } 


class UserPrefsSerializer(serializers.HyperlinkedModelSerializer): 

    favorite_products = serializers.HyperlinkedRelatedField(
     queryset = Product.objects.all(), 
     many = True, 
     read_only = False, 
     view_name = 'product-detail', 
     lookup_field = 'slug',) 

    class Meta: 
     model = UserPrefs 
     fields = (
      'url', 
      'other_prefs', 
      'favorite_products', 
     ) 

、私のPUT:

http -a my_auth_details PUT http://localhost/api_v2/userprefs/1/ {favorite_products: ['http://localhost/api_v2/product/jacket/', 'http://localhost/api_v2/product/shirt/']} 

...と結果:あなたは上書きしませんでしたよう

HTTP/1.0 200 OK 

{ 
    "favorite_products": [], 
    "url": "http://localhost:8000/api_v2/userprefs/1/" 
} 
+0

がうまくメソッドの仕事を得るです確認してください? – Windsooon

答えて

1

に思えますメソッドのを作成する()UserPrefsSerializer()。

class UserPrefsSerializer(serializers.HyperlinkedModelSerializer): 

    favorite_products = serializers.HyperlinkedRelatedField(
     queryset = Product.objects.all(), 
     many = True, 
     read_only = False, 
     view_name = 'product-detail', 
     lookup_field = 'slug',) 

    class Meta: 
     model = UserPrefs 
     fields = (
      'url', 
      'other_prefs', 
      'favorite_products', 
     ) 

    def create(self, validated_data): 

     favorite_products_data = validated_data.pop('favorite_products') 

     user_prefs = UserPrefs.objects.create(**validated_data) 

     for favorite_product_data in favorite_products_data: 
      favorite_product = Product.objects.create(**favorite_product_data) 
      user_prefs.favorite_products.add(favorite_product) 

     return user_prefs 

    def update(self, instance, validated_data): 

     favorite_products_data = validated_data.pop('favorite_products') 

     instance.other_prefs = validated_data.get('other_prefs', instance.other_prefs) 

     instance.save() 

     for favorite_product_data in favorite_products_data: 
      favorite_product = Product(**favorite_product) 
      favorite_product.save() 

     return instance 

Writable nested serializers

関連する問題