2016-04-12 11 views
1

alır. Örnek almak için POST veya örnek almak için GET kullandığımda, o zaman tamam. Ancak bir örneği güncellemek için PATCH yöntemini kullandığımda, güncelleme yöntemi validated_data olarak boş bir dict alır. Bunun sebebi nedir? Temel olarak yanlış bir yaklaşım kullanırsam, lütfen bana doğru yolu göster. Teşekkürler!Django REST Framework. Güncelleme boş bir validated_data

class UserSerializer(serializers.ModelSerializer): 
    # password = serializers.CharField(write_only=True) 

    class Meta: 
     model = get_user_model() 
     fields = ('id', 'email', 'first_name', 'last_name', 'password',) 
     read_only_fields = ('is_staff', 'is_superuser', 'is_active',) 
     extra_kwargs = {'password': {'write_only': True}} 

    def create(self, validated_data): 
     password = validated_data.pop('password') 
     user = self.Meta.model(**validated_data) 
     user.set_password(password) 
     user.is_active = True 
     user.save() 
     return user 

    def update(self, instance, validated_data): 
     print validated_data # returns {} - empty dict 
     return instance 

Ben görünüm olarak ModelViewSet kullanın:

class UserViewSet(viewsets.ModelViewSet): 
    queryset = get_user_model().objects.all() 
    serializer_class = UserSerializer 

urls.py: Ben pycharm DİNLENME Client kullanmak ve isteği parametresi olarak "first_name = Ad" göndermek test için

router = routers.DefaultRouter() 
router.register(r'accounts', UserViewSet, base_name='User') 

urlpatterns = [ 
    url(r'', include(router.urls)), 
] 

PATCH/accounts/1/ Yukarıdaki seri hale getirici üzerindeki baskı "{}" harfini gösterir. Gerekli hesap var ve seri hale getirici hedef örneği alıyor.

+2

Sadece sahip bazı kod ile bunu test ettik ve düzgün çalıştı. Görüşünüzü gösterir misiniz lütfen? ve belki de test? Şimdiden teşekkürler. –

+0

Teşekkür ederim, Vladir! Bu gönderiyi views.py ve urls.py kodumla güncelledim. – user1564009

cevap

1

Tamam, sizin durumunuza bir çözüm buldum. Bir yıldan fazla bir süredir PyCharm kullanıyor olmama rağmen, bu aracı daha önce kullanmamıştım. Bu harika bir araç, ancak detaylar hakkında çok fazla belge yok. Çözüm:

  • Önce bir göz here almak, istek üzerine JSON (Content-Type: application/json) olarak isteği göndermek gerekir, iyi nasıl yapılacağını orada açıklanmıştır.
  • İkinci olarak, Request Body numaralı üçüncü sütunda Text seçeneğini seçin ve bu yapıyı {"first_name": "Name"} olarak ayarlayın (bu benim için daha zor kısmıydı). Daha fazla ayrıntı için

aşağıda ekleyerek ediyorum bu ekran görüntüsünü kontrol edin:

enter image description here

+0

Teşekkür ederim, Vladir! JSON'u gönderirsem işe yarıyor! – user1564009

+0

Çok hoş geldiniz! –