Python Django Rest Framework Serializer Update Hatası

BattOS

Hectopat
Katılım
21 Eylül 2019
Mesajlar
88
Daha fazla  
Cinsiyet
Erkek
Merhaba.
Temmuzda staja başlayacağım ve staj yapacağım şirket backend de Django Rest Framework kullanıyor bu yüzden DRF öğreniyorum ama aldığım bir hatayı çözemedim. Update yapmaya çalıştığımda bütün alanların gönderilmesini istiyor şu anda API ama ben sadece güncellemek istediğim alanları göndermek istiyorum.
Serializer:
Python:
class TodoSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(allow_blank=False, max_length=64)
    description = serializers.CharField(allow_blank=False, max_length=256)
    done = serializers.BooleanField(default=False)
    owner = serializers.PrimaryKeyRelatedField(many=False, queryset=User.objects.all(), required=False)

    def create(self, validated_data):
        return models.Todo.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.description = validated_data.get('description', instance.description)
        instance.done = validated_data.get('done', instance.done)
        instance.save()
        return instance

View classda put methodu:
Python:
def put(self, request, pk):
    todo = self.getTodo(pk)
    if todo.owner != request.user:
        return Response(status=status.HTTP_403_FORBIDDEN)
    serializer = TodoSerializer(todo, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Aldığım hata:
1687244735553.png


Nasıl düzeltebilirim? Cevaplar için şimdiden teşekkürler.

Henüz cevap gelmedi ama ben sorunu sonunda çözdüm, birkaç şey denedim olmadı çok uzatmayacağım. Serializer'a title ve description'a required=False ekledim. Böyle yapınca oluştururken başlık boş olabiliyordu ama bunu istemediğim için biraz düşündükten sonra Serializer'da create methoduna
Python:
if validated_data.get("title") == None:
    raise serializers.ValidationError("Title is required on create")
ekledim. Böylece create işleminde title gönderilmemişse hata verip oluşturmuyor ama update ederken hata vermiyor. Ayrıca gönderirken title="" olarak gönderilmesin diye Serializer'da title'a min_length=4 ekledim.
 
Son düzenleyen: Moderatör:
required=Flase Güzel yaklaşım, ancak birkaç noktaya dikkat çekmek istiyorum:

Amacını anladım özellikle Update sırasında validated_data.get('değer', instance.değer) şeklindeki kodu. Eğer gelen veride boş bir veri varsa değeri Instance'dan alsın istiyorsun böylece sadece değişen kısım günlenecek.

Durum şu ki get methodu eğer sözlükte o değer yoksa senin var sayılan olarak gösterdiğin değeri alır, değerin None veya içi boş bir string olmasına bakmaz.

- Title değeri var çünkü title=' ', # Instance.title alınmaz, onun yerine ' ' alınır

- Description var çünkü değeri description = None, Instance.description alınmaz onun yerine None alınır.

Bir örnek çıktıyı ekledim

Benim önerim Update etmeden önce veriyi karşılaştırıp alman

İstersen kodun bir git reposundaysa inceleyebilirim
 

Dosya Ekleri

  • örnek.jpg
    örnek.jpg
    29,5 KB · Görüntüleme: 20
Son düzenleme:

Technopat Haberler

Geri
Yukarı