Python 如何在Django Rest框架中更新HyperlinkedRelatedField

Python 如何在Django Rest框架中更新HyperlinkedRelatedField,python,json,django,django-rest-framework,Python,Json,Django,Django Rest Framework,我正试图通过Django Rest框架更新连接到Django中ManyToManyField的HyperlinkedRelatedField,并获得一个忽略我的HyperlinkedRelatedField数据的成功PUT(状态200)。我显然错过了什么,但是什么 #models.py class Product(models.Model): name = models.CharField(_('Name'),) number = models.IntegerField(_(

我正试图通过Django Rest框架更新连接到Django中ManyToManyField的HyperlinkedRelatedField,并获得一个忽略我的HyperlinkedRelatedField数据的成功PUT(状态200)。我显然错过了什么,但是什么

#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',
        )
例如,从命令行使用httpie,我的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/"
}

似乎您没有覆盖UserPrefsSerializer()的create()方法。

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

请检查您似乎没有覆盖UserPrefsSerializer()的create()方法。

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

请检查“get”方法是否有效?get方法是否有效?