I have a model called
Product
and two viewsets that manage the same model in different ways. Each one must set a different value for fieldproduct_type
, which is set read_only in the serializerSuplementSerializer
.I trying to override
perform_create()
method and set the value for fieldproduct_type
, but it always takes the default value.This is my model:
class Product(models.Model): ROOM = 'ROOM' SUPLEMENT = 'SUPLEMENT' PRODUCT_TYPE_CHOICES = ( (ROOM, _('Room')), (SUPLEMENT, _('Suplement')) ) hotel = models.ForeignKey(Hotel, on_delete=models.PROTECT, related_name='products', verbose_name=_('Hotel')) name = models.CharField(max_length=100, verbose_name=_('Name')) product_type = models.CharField(max_length=9, choices=PRODUCT_TYPE_CHOICES, default=ROOM, verbose_name=_('Product Type')) room_type = models.ForeignKey(RoomType, null=True, blank=True, on_delete=models.PROTECT, related_name='products', verbose_name=_('Room Type')) plan_type = models.ForeignKey(PlanType, null=True, blank=True, on_delete=models.PROTECT, related_name='products', verbose_name=_('Plan Type')) content_type = models.ForeignKey(ContentType, null=True, blank=True, on_delete=models.PROTECT, related_name='rate_base_products', verbose_name=_('Rate Base')) object_id = models.PositiveIntegerField(null=True, blank=True) rate_base = GenericForeignKey('content_type', 'object_id') class Meta: verbose_name = _('Product') verbose_name_plural = _('Products') def __str__(self): return "[{}][{}]{}".format(self.id, self.hotel, self.name) def save(self, *vars, **kwargs): self.full_clean() return super().save(*vars, **kwargs) def clean(self, *vars, **kwargs): if self.content_type != None: if self.content_type.model != 'ages' and self.content_type.model != 'roombase' and self.content_type.model != 'product': raise CustomValidation(_("rate_base must be an instance of either 'Ages' or a 'RoomBase'"), 'rate_base', status.HTTP_400_BAD_REQUEST)
These are my viewsets:
class SuplementViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticated,) queryset = models.Product.objects.filter(product_type=models.Product.SUPLEMENT) serializer_class = serializers.SuplementSerializer filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,) search_fields = ('hotel__name', 'name') def perform_create(self, instance): instance.product_type = models.Product.SUPLEMENT instance.save() class ProductViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticated,) queryset = models.Product.objects.all() serializer_class = serializers.ProductSerializer filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,) search_fields = ('hotel__name', 'name') filter_fields = ('hotel__name', 'name')
And this is my serializer:
class SuplementSerializer(serializers.ModelSerializer): class Meta: model = models.Product fields = ('id', 'hotel', 'product_type', 'name') read_only_fields = ('product_type',) def __init__(self, *args, **kwargs): exclude = kwargs.pop('exclude', None) super(SuplementSerializer, self).__init__(*args, **kwargs) if exclude is not None: for field_name in exclude: self.fields.pop(field_name)
I don't know why I can't set the value for field
product_type
.
score:7
Argument to perform_create()
method is serializer instance not an object instance. You can set the field as below
def perform_create(self, serz):
serz.save(product_type=models.Product.SUPLEMENT)
See explanation here http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/#refactoring-to-use-viewsets
Credit To: stackoverflow.com
Related Query
- How can I override Django Rest Framework viewset perform_create() method to set a default value to a field
- Django Rest Framework override viewset list() method without loosing filter_backends functionality
- How to set a method in Django rest framework's ViewSet to not require authentication
- How to override the request method (from 'PUT' into 'POST') in Django Rest Framework
- How to use update method in viewsets in Django Rest Framework and perform some task(like sending mail) along with it?
- Django Rest Framework - Create method on ViewSet and Serializer
- How can I create custom user model for different user types using django rest framework
- How to create an object and then set related field in Django Rest Framework
- How to override POST method for bulk adding - Django Rest Framework
- How do create an object that has multiple objects in django rest framework via a POST method using class based views
- How to create a Django REST Framework View instance from a ViewSet class?
- Django Rest Framework - Override serializer create method for model with self-referential M2M field
- How can i create both the child and parent object in one request Django rest framework
- How can I enable CORS on Django REST Framework
- How can modify request.data in django REST framework
- How can I make a trailing slash optional on a Django Rest Framework SimpleRouter
- Django rest framework override page_size in ViewSet
- Django rest framework permission_classes of ViewSet method
- How to create a new user with django rest framework and custom user model
- How can i access QueryString values in Serializer Django Rest Framework
- How can I get the parent object in Django Rest Framework serializer
- override create method in django rest generics CreateAPIView
- How to add django rest framework permissions on specific method only ?
- How to make a field editable on create and read-only on update in Django REST framework
- how to create serializer for an enum field in django rest framework
- How can i bulk create in django rest serializer
- How to override exception messages in django rest framework
- Call method once to set multiple fields in Django Rest Framework serializer
- How can I stop django REST framework to show all records if query parameter is wrong
- How can one customize Django Rest Framework serializers output?
More Query from same tag
- Is there a function that is called when you visit a view in django
- Celery interval schedule time
- Can't import modules - ImportError: No module named
- makemigrations reponses No changes detected when app_label is specified
- Django TimeLimitExceeded error
- NameError: name 'Post' is not defined
- Django template filters, tags, simple_tags, and inclusion_tags
- Django Tags/Filter and Templates
- Django Template if tag not working under FastCGI when checking bool True
- Django templates and DRY - how to avoid duplicated HTML
- Redirect error with django. Nothing seems to work
- Django Model Formset Only first form required
- UTF-8 latin-1 conversion issues, python django
- Using Tag model to create ManytoMany relationship
- Overwrite Submit button label in django crispy forms