different validation in drf serializer per request method

2024/10/15 11:24:52

Lets say i have a model like so:

class MyModel(models.Model):first_field = models.CharField()second_field = models.CharField()

and an API view like so:

class MyModelDetailAPI(GenericAPIView):serializer_class = MyModelSerializerdef patch(self, request, *args, **kwargs):# Do the updatedef post(self, request, *args, **kwargs):# Do the post

The first_field is a field that is only inserted in the POST method (and is mandatory) but on each update, the user can't change its value so the field in the PATCH method is not mandatory.
How can i write my serializer so that the first_field is required on POST but not required on PATCH. Is there any way of dynamically setting the required field so i can still use the DRF validation mechanism? Some sort of validator dispatcher per request method?
I want something like this for example:

class MyModelSerializer(serializers.ModelSerializer):class Meta:model = MyModelfields = {'POST': ['first_field']'PATCH': []}
Answer

I need more space than comments provide to make my meaning clear. So here is what I suggest:

  1. Different formatting means different serializers.

    So here you have, for instance a MyModelSerializer and a MyModelCreationSerializer. Either create them independently, or have one inherit the other and specialize it (if it makes sense).

  2. Use the appropriate GenericAPIView hook to return the correct serializer class depending on self.action. A very basic example could be:

    class MyModelDetailAPI(GenericAPIView):# serializer_class = unneeded as we override the hook belowdef get_serializer_class(self):if self.action == 'create':return MyModelCreationSerializer return MyModelSerializer
    

    Default actions in regular viewsets are documented here, they are:

    • create: POST method on base route url
    • list: GET method on base route url
    • retrieve: GET method on object url
    • update: PUT method on object url
    • partial_update: PATCH method on object url
    • destroy: DELETE method on object url
https://en.xdnf.cn/q/69295.html

Related Q&A

How to import r-packages in Python

Im a bit troubled with a simple thing. I was trying to install a package called hunspell, but I discovered it is originally an R package. I installed this version: https://anaconda.org/conda-forge/r-hu…

XPath predicate with sub-paths with lxml?

Im trying to understand and XPath that was sent to me for use with ACORD XML forms (common format in insurance). The XPath they sent me is (truncated for brevity):./PersApplicationInfo/InsuredOrPrinci…

Best way to access and close a postgres database using python dataset

import dataset from sqlalchemy.pool import NullPooldb = dataset.connect(path_database, engine_kwargs={poolclass: NullPool})table_f1 = db[name_table] # Do operations on table_f1db.commit() db.execut…

Using different binds in the same class in Flask-SQLAlchemy

I currently have multiple databases with identical Tables and Columns (but different data inside). So clearly I need to use binds to access all of them, but its apparently not as simple as doing this:c…

Correctly parse date string with timezone information

Im receiving a formatted date string like this via the pivotal tracker API: "2012/06/05 17:42:29 CEST"I want to convert this string to a UTC datetime object, it looks like python-dateutil doe…

Can I add a sequence of markers on a Folium map?

Suppose I had a list, or pandas series, or latitude longitude pairs. With Folium, I can plot markers for a single pair of coordinates using coords = [46.8354, -121.7325] map_4 = folium.Map(location=[4…

Tkinter in Python 3.4 on Windows dont post internal clipboard data to the Windows clipboard on exit

I use the following code to place result of my small scripts in clipboard.from tkinter import Tk r = Tk() r.withdraw() r.clipboard_clear() r.clipboard_append("Result")It works fine on Python …

How do I group date by month using pd.Grouper?

Ive searched stackoverflow to find out how to group DateTime by month and for some reason I keep receiving this error, even after I pass the dataframe through pd.to.datetimeTypeError: Only valid with D…

Python Too many indices for array

I am reading a file in python using pandas and then saving it in a numpy array. The file has the dimension of 11303402 rows x 10 columns. I need to split the data for cross validation and for that I …

Removing named entities from a document using spacy

I have tried to remove words from a document that are considered to be named entities by spacy, so basically removing "Sweden" and "Nokia" from the string example. I could not find …