first commit
This commit is contained in:
37
reviews/serializers.py
Normal file
37
reviews/serializers.py
Normal file
@@ -0,0 +1,37 @@
|
||||
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
|
||||
Reference in New Issue
Block a user