2015-05-23 10 views
17

Şu anda uyguladığım RESTful API için djangorestframework uyguluyor. Onunla oynadıktan sonra, hala seri hale getiricide kullanılan .create(self, validated_data) ve .update(self, validated_data) nu anlamadım. Anladığım kadarıyla CRUD yalnızca 4 ana yöntemi viewsets.ModelViewSet: create(), retrive(), update() ve destroy() olarak çağırır.Oluşturduğunuzda ve djangorestframework serializer'da ne zaman güncellendiniz?

Ben de zaten hata ayıklamak için denenmiş ve .create() ve .update() yöntemleri ModelViewSet ve ModelSerializer hem çağrıldığında görmek için malzeme çıktısını var. Görünüşe göre, HTTP fiillerini yaptığımda yalnızca ModelViewSet'daki yöntemler çağrılır. Ancak, ModelSerializer için, bu 2 yöntemde hiç çağrı görmüyorum. Sadece ModelSerializer'da kullanılan yöntemlerin ne olduğunu bilmek istiyorum, çünkü insanların bu yöntemleri seri hale getiricide çok fazla geçersiz kıldığını görüyorum.

P/S: Ben djangorestframework + ingilizcesi için üzgünüm, çünkü yerel değilim.

sayesinde :) gerisi-api tasarımda

cevap

50

Görünümler ile seri hale getirici arasında bir şeyler ayırmanız gerekir.

Serileştiriciler

Serializer bağımsız bir amacıdır. Bir Django modelini (veya herhangi bir python veri yapısını, aslında) seri hale getirilmiş bir formata dönüştürmek için kullanılır. Bunu istediğiniz yerde kullanabilirsiniz. Çıktınızdaki URI'lere ihtiyacınız olmadığı sürece gerçek bir HTTP isteğine bile gerek yoktur.

ModelSerializer alt sınıfı, "modelden yükle" ve "modele kaydet" işlevlerini ekleyen özelleştirilmiş bir Serializer türdür. "Modele kaydet" giriş noktası, save() yöntemidir. Daha kolay geçersiz kılınması için, varsayılan uygulaması, yeni bir model örneği oluşturup oluşturmadığına veya bir tane güncelleştirip güncelleştirmediğine bağlı olarak işini serileştiricinin create() veya 123 update() yöntemine devreder.

Bunun amacı, kişiselleştirmedir: size, geliştiriciyi, yalnızca oluşturma yöntemini, yalnızca güncelleştirme yöntemini veya ortak davranışını geçersiz kılma seçeneği sunar.

def save(self, **kwargs): 
    # Will be done on every save 
    kwargs['last_changed'] = timezone.now() 
    return super().save(**kwargs) 

def create(self, instance, data): 
    # Will only be done if a new object is being created 
    data['initial_creation'] = timezone.now() 
    return super().create(instance, data) 

temel örnek: Mesela , bu şeylerin bu tür yapmak için izin verir. Orada, bir nesne kaydedildiğinde, bir oluşturma veya güncelleme olduğunda, last_changed alanı ayarlanır. Bir sidenote olarak, muhtemelen bunu yapmak istemezsiniz. "Last_changed" alanlarının ayarlanması gibi şeyler, seri hale getiricide değil, görünümde yaşamalıdır.

Viewsets bambaşka yerde

Django DİNLENME çerçeve malzemeleri Viewsets. Bunlar, model için bir CRUD API'sinin uygulanması etrafında dönen, organize bir görünüm koleksiyonudur. Böylelikle, create(), retrieve()/list(), update() ve delete() gibi bir dizi yönteme işlevselliğini yapılandırır.

Ana madde: : create() yöntemi ve serisinin izleyicisi create() yöntemi arasında hiçbir bağlantı yoktur.

Sadece viewset en yöntemlerinin varsayılan uygulaması ModelSerializer kullanır ve bu bunun olması serileştirici en save() yöntem delegelerin varsayılan uygulama aynı ada sahip yöntemlere bir iş. Bu arada

, last_changed örnek hakkında, burada görünümünde bunu görecektir:

Yukarıdaki örneğe işlevsel olarak eşdeğer, ama viewset yaşayan
def perform_create(self, serializer): 
    now = timezone.now() 
    serializer.save(initial_creation=now, last_changed=now) 

def perform_update(self, serializer): 
    serializer.save(last_changed=timezone.now()) 

.

Yani sorunuza geri

Sonuç

, geçersiz kılmak gereken belirli şey nesne eklemek istediğiniz görev için sorumlu olduğu bağlıdır. Özel davranışınız seri hale sürecinin parçası ise

  • , yani uygun bir Django modele geri ham veriyi dönüştürerek ve kaydetmeden süreci, o zaman Serializer 'ın yöntemlerini geçersiz kılar edilir.
  • Diğer taraftan, özel davranışınız sizin bakış açınıza özgü ise, Viewset yöntemlerini geçersiz kılmanız gerekir.

Bir ipucu olarak, kendinize şu soruyu sorabilirsiniz: Aynı seriyi başka bir yerde (belki başka bir görünümde) kullanırsam, her zaman bu davranışı göstermeli mi?

+1

Cevabınız için teşekkürler! Tam olarak istediğim gibi gerçekten detaylı ve derin. +1 :) – Tim

3

okumak, güncelleme ve silme yaratmak bir standarttır. Oluşturma ve güncelleştirme konusunda oldukça büyük bir fark yoktur.

this bakınız ve

create() yöntemi bir öğesi oluşturulur görüyoruz.

ve

update() yöntem güncellenmesi hangi madde belirtmek gerekir.

+0

Bu 2 arasındaki fark nedir? – Tim

13

ben de anladım nasıl .create() ve .update()Serializer çalışma (özellikle ModelSerializer) ve Viewsets (özellikle ModelViewSet) nasıl bağlanacağını. Birisi bu soruya gelirse kavramı daha net bir şekilde açıklığa kavuşturmak istiyorum.

Temel olarak, 4 yöntem CRUDModelViewSet içinde: .create(), .retrieve(), .update() ve .destroy() HTTP fiilden çağrıları olacaktır. Varsayılan olarak, ModelViewSet'ten gelen .create() ve .update(), ModelSerializer'dan .create() ve .update()'dan BaseSerializer sınıfından .save() yöntemini çağırarak arayacaktır. nesne self.instance var olup olmadığını belirleyerek ModelSerializer içinde .create() veya .update() arayacak olup

kaydet() yöntemi belirler.