from rest_framework import serializers from apps.shelf_books.models import ShelfBook from apps.books.models import Book from apps.shelves.models import Shelf from apps.shelves.serializers import ShelfSerializer from apps.books.serializers import BookSerializer class ShelfBookSerializer(serializers.ModelSerializer): shelf = ShelfSerializer(read_only=True) book = BookSerializer(read_only=True) book_id = serializers.PrimaryKeyRelatedField( queryset=Book.objects.all(), source="book", write_only=True ) class Meta: model = ShelfBook fields = [ "id", "shelf", "book", "book_id", "quantity" ] read_only_fields = ["id"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) request = self.context.get("request") if request and request.user and request.user.is_authenticated: self.fields["book_id"].queryset = Book.objects.filter( user=request.user ) else: self.fields["book_id"].queryset = Book.objects.none() def validate(self, attrs): attrs = super().validate(attrs) book = attrs.get("book") shelf = self.context.get("shelf") if not book: book = self.instance.book if not shelf: return attrs qs = ShelfBook.objects.filter( book=book, shelf=shelf ) if self.instance: qs = qs.exclude(pk=self.instance.pk) if qs.exists(): raise serializers.ValidationError( "This Book already exists in shelf!" ) if book.user_id != shelf.user_id: raise serializers.ValidationError( "Book and Shelf must be from the same user!" ) return attrs def create(self, validated_data): shelf = self.context["shelf"] validated_data["shelf"] = shelf return super().create(validated_data) def update(self, instance, validated_data): shelf = self.context["shelf"] validated_data["shelf"] = shelf return super().update(instance, validated_data)