Getting field value with DjangoRestFramework serializer

Viewed 292

I have two models:

class Restaurant(models.Model):    
    adress = models.CharField(max_length=240)    
    name = models.CharField(max_length=140)

class RestaurantReview(models.Model):    
    review_author = models.ForeignKey(settings.AUTH_USER_MODEL,
                                      on_delete=models.CASCADE)    
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

I use DRF and front-end I need the values of the fields to use in Vue.je templates. Here is my serializer:

class RestaurantReviewSerializer(serializers.ModelSerializer):
    restaurant_name = serializers.CharField(source='restaurant.name')
    restaurant_adress = serializers.CharField(source='restaurant.adress')
    created_at = serializers.SerializerMethodField()
    review_author = serializers.StringRelatedField(read_only=True)

class Meta:
    model = RestaurantReview
    fields = ('id','restaurant_name','restaurant_adress','created_at','review_author')
    def get_created_at(self, instance):
        return instance.created_at.strftime("%d %B, %Y")

I get the right data I need but my problem is now I can't update/create new models. As suggested I added ('read_only'=True) but the result is the same.

Should I use to_representation to get the same CRUD posibilities than with:

class RestaurantReviewSerializer(serializers.ModelSerializer):
     class Meta:
         model = RestaurantReview
         field = fields = '__all__'

But with the benefit to have for exemple 'restaurant' named after its name and not its ID so I can use it in my template?

1 Answers

Follow to comment above.

Use single viewset and override get_serializer_class. No other thing to change.

class RestaurantReviewViewSet(viewsets.ModelViewSet):
    queryset = RestaurantReview.objects.all()

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return RestaurantReviewGETSerializer # your above serializer
        else:
            return RestaurantReviewSerializer # default serializer
Related