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?
Cevabınız için teşekkürler! Tam olarak istediğim gibi gerçekten detaylı ve derin. +1 :) – Tim