Check self._state of the model.
self._state.adding is True when the model is being created.
self._state.adding is False when the model is being updated.
Model-agnostic way of excluding:
query.exclude(pk=instance.pk)
using in with list comprehension:
query.exclude(id__in=[o.id for o in <unwanted objects>])
subclass PrimaryKeyRelatedField and overload the get_queryset method
class UserFilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
request = self.context.get('request', None)
queryset = super(UserFilteredPrimaryKeyRelatedField, self).get_queryset()
if not request or not queryset:
return None
return queryset.filter(user=request.user)
// In serializers.py
class MySerializer(serializers.ModelSerializer):
related = UserFilteredPrimaryKeyRelatedField(queryset=MyModel.objects)
Quoting the docs:
request.data:
REST framework introduces a Request object that extends the regular HttpRequest, and provides more flexible request parsing. The core functionality of the Request object is the request.data attribute, which is similar to request.POST, but more useful for working with Web APIs.
request.POST : Only handles form data. Only works for 'POST' method.
request.data : Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
request.body:
The raw HTTP request body as a byte string. This is useful for processing data in different ways than conventional HTML forms: binary images, XML payload etc. For processing conventional form data, use HttpRequest.POST.
In short, request.body is simply the body of the request. request.data is a fully parsed body (ex - python dict) that is more convenient to handle.
Blog on working with request.data in DRF