Python 如何在Django Rest框架中更新HyperlinkedRelatedField
我正试图通过Django Rest框架更新连接到Django中ManyToManyField的HyperlinkedRelatedField,并获得一个忽略我的HyperlinkedRelatedField数据的成功PUT(状态200)。我显然错过了什么,但是什么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(_(
#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方法是否有效?