I'm building my first API with Django-Rest-Framework and I'm a little stuck with the validation process. Hopefully this is an easy answer but I couldn't figure it out from the 6-part intro tutorial...
I have a model:
class XYZMeta(models.Model):
id = models.AutoField(primary_key=True)
xyz_id = models.ForeignKey(XYZ)
user_id = models.ForeignKey(User)
field_name = models.CharField(blank=True, max_length=50)
value = models.TextField(blank=True)
And a serializer:
class XYZMetaSerializer(serializers.ModelSerializer):
class Meta:
model = XYZMeta
fields = ('id', 'xyz_id', 'user_id', 'field_name', 'value')
And a view:
class XYZMetaViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows xyz metadata to be viewed or edited.
"""
queryset = XYZMeta.objects.all()
serializer_class = serializers.XYZMetaSerializer
def perform_create(self, serializer):
serializer.save(user_id=self.request.user)
When I send a POST to create a new object, it works great and uses the ID of the authorized user rather than whatever value I provide. Example:
> curl -X POST -H "Content-Type:application/json" -d '{"xyz_id":"12345",**"user_id":2**,"field_name":"abc","value":"abc comment"}' -u admin:admin http://mysite/xyzmeta/
{"id":2,"dealer_id":12345,**"user_id":1**,"field_name":"abc","value":"abc comment","create_date":"2015-02-22T23:32:27.928991Z"}
However, if I leave the user_id off entirely (since it doesn't matter anyway), I get an error that the field is required:
> curl -X POST -H "Content-Type:application/json" -d '{"xyz_id":"12345","field_name":"abc","value":"abc comment"}' -u admin:admin http://mysite/xyzmeta/
{"user_id":["This field is required."]}
How do I specify that I want the user_id foreign key field to be programmatically set during the create process, and not have to provide a dummy value?
How about just having
required=False
foruser_id
field?I haven't tested this..but something like this should work!
Since the
user_id
is useless in the request, you could simply skip it from the serializer, and add it later in the ViewSet'sperform_create
method:One approach: make
user_id
field non-requiredAnother approach: alter
request.data
before theget_serializer(data=request.data)
method call.