I'm using Django and django-restfframework for following task. I need these 3 models. (1) Person model to keep customer info. (2) Sensor model and (3) DataPoint model. Each is a one to many relationship. A Person can have many sensors and each sensor can have many data points but never the other way around. I have created following models in my models.py file. ..
class Person(models.Model):
first_name = models.CharField(max_length=30, null=False)
last_name = models.CharField(max_length=30, null=False)
class Sensor(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
name = models.CharField(max_length=100, null=False)
sensor_id = models.UUIDField(null=True, blank=True)
class DataPoint(models.Model):
sensor = models.ForeignKey(Sensor, on_delete=models.CASCADE)
date_time_instance = models.DateTimeField()
value = models.DecimalField(max_digits=10, decimal_places=4)
Serializer.py has following code...
class PersonSerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = ('id', 'first_name', 'last_name')
class SensorSerializer(serializers.ModelSerializer):
person = PersonSerializer()
class Meta:
model = Sensor
fileds = ('id', 'name', 'person')
class DataPointSerializer(serializers.ModelSerializer):
sensor = SensorSerializer()
class Meta:
model = DataPoint
fileds = ('id', 'date_time_instance', 'value', 'sensor')
views.py has following code for datapoint API request...
@api_view(['GET', 'POST'])
def datapoint_list(request):
if request.method == 'GET':
dp = DataPoint.objects.all()
serializer = DataPointSerializer(dp, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = DataPointSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Here are my questions:-
Have I created good relation database schema?
It seems when I do a datapoint POST request, I have to give all Person and all sensor information. How can I just supply the datapoint request (time stamp and data value) and let everything else be taken care of (i.e. proper sensor and person check) ?
Would a non relation database scheme help ? How ?
Where can I specify that all requests are JSON requests in my django app ?
Thanks in advance for your help.
save()method in the DataPointSerializer such that it parsed the Person and Sensor from the URL. Ex: POST to `/api/datapoint/<Person_id>/<Sensor_id>/' and then pull kwargs from the URL when creating (or updating, if exists) the datapoint.