Serializer Foreign Key Için Get Ve Post Davranış Farklılıkları
Elimizde 2 model sınıfımız olsun, birisi diğerine Foreignkey ile ilişki kursun. Hatta hemen örnek verelim ;
class Locations(models.Model):
#fields
latitude = models.FloatField(null=True)
longitude = models.FloatField(null=True)
name = models.CharField(max_length=1000)
class Personnels(models.Model):
#fields
name = models.CharField(max_length=200)
surname = models.CharField(max_length=200)
#foreign keys
location = models.ForeignKey(
Locations,
on_delete=models.CASCADE,
null=True)
Şimdi içerisinde hem Personnels modelindeki verilerin datatable ile gösterildiği hem de yeni personel eklemek için input alanlarının olduğu bir sayfa hayal edelim. Bu sayfadan bize Ajax ile tabloyu doldurmak için GET ; input alanlarında doldurulan verileri Personnels tablosuna kaydetmek için de POST istekleri atılıyor olsun.
Bu durumda;
-
GET isteğinde serializer’ımız, Personnels modelindeki alanlara göre verileri getirmeli ÖZELLİKLE FOREIGNKEY OLAN “location” FIELD’INDA SADECE ID DÖNMEYECEK,RELATED TABLODAN O ID’YE İLİŞKİN VERİYİ DÖNMELİDİR. (Ki tablomuzdaki personelin lokasyon verisini gösterebilelim. Sadece foreignkey id’sini dönersek lokasyon verisini gösteremeyiz)
-
POST isteğinde ise, bu kez gelen verinin içindeki “location”:3 şeklinde olacak kısım için Locations modeli tipinde bir dictionary beklememeli, string ifade beklemelidir.
?Peki aynı serializer içerisinde,aynı field için 2 farklı davranışı nasıl sağlayacağız?
HEMEN CEVABI ÖRNEK İLE VERELİM ;
class PersonnelsSerializer(serializers.ModelSerializer):
user = UsersSerializer()
location = LocationsSerializer(read_only=True)
location_id = serializers.PrimaryKeyRelatedField(queryset = Locations.objects.all(),source='location',write_only=True)
class Meta:
model = Personnels
exclude = ()
Evet, yukarıda görüldüğü gibi serializer içerisinde GET istediği için “location” , POST isteği içinse “location_id” alanları oluşturuldu. GET için olana read_only=True, POST için olana ise write_only=True özelliği verildi. Ekstra olarak tanımlanan parametrelere dikkat etmek de mühim tabii…
Tabii POST ile backende veri gönderirken “location”:3 şeklinde değil de “location_id”:3 şeklinde göndermemiz icab ediyor.
Böylece aynı serializer içerisinde aynı field’ı POST ve GET için 2 farklı şekilde handle etmiş olduk.
Leave a comment