38 lines
1.6 KiB
Python
38 lines
1.6 KiB
Python
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
|