from rest_framework import serializers from django.contrib.contenttypes.models import ContentType from .models import Rating class RatingSerializer(serializers.ModelSerializer): user = serializers.StringRelatedField(read_only=True) model_name = serializers.CharField(write_only=True) # Örn: 'product' object_id = serializers.IntegerField() class Meta: model = Rating fields = ['id', 'score', 'comment', 'user', 'created_at', 'model_name', 'object_id'] read_only_fields = ['id', 'created_at', 'user'] def create(self, validated_data): model_name = validated_data.pop('model_name').lower() object_id = validated_data.pop('object_id') user = self.context['request'].user # Model adından ContentType'ı bul try: # app_label='product' varsayımı yapıyoruz veya tüm app'lerde arayabiliriz. # Daha güvenli olması için app_label'ı da parametre alabiliriz ama şimdilik basit tutalım. # Genellikle model isimleri unique olur. content_type = ContentType.objects.get(model=model_name) except ContentType.DoesNotExist: raise serializers.ValidationError(f"Model '{model_name}' bulunamadı.") # Kullanıcının daha önce oy verip vermediğini kontrol et (unique_together constraint var ama burada da yakalayalım) rating, created = Rating.objects.update_or_create( content_type=content_type, object_id=object_id, user=user, defaults={'score': validated_data.get('score'), 'comment': validated_data.get('comment')} ) return rating