【发布时间】:2016-06-07 16:06:41
【问题描述】:
我正在使用 Django 和 django-restfframework 来完成以下任务。 我需要这三个模型。 (1) 保存客户信息的人员模型。 (2) 传感器模型和 (3) DataPoint 模型。每个都是一对多的关系。一个人可以有很多传感器,每个传感器可以有很多数据点,但不能反过来。我在我的 models.py 文件中创建了以下模型。 ..
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 有以下代码...
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 有以下数据点 API 请求代码...
@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)
这是我的问题:-
我是否创建了良好的关系数据库架构?
似乎当我执行数据点 POST 请求时,我必须提供所有人员和所有传感器信息。我怎样才能只提供数据点请求(时间戳和数据值)并让其他所有事情都得到处理(即正确的传感器和人员检查)?
非关系数据库方案会有帮助吗?怎么样?
在哪里可以在我的 django 应用中指定所有请求都是 JSON 请求?
提前感谢您的帮助。
【问题讨论】:
-
你能澄清一下#2吗?我想我明白您的意思,但是对数据点 API 端点的 POST 请求将创建一个全新的数据点,因此除非您指定,否则无法知道人员和传感器。如果要更新数据点,可以接受 PUT 和 PATCH 方法。如果您设置为仅使用 POST,则可以在 DataPointSerializer 中编写
save()方法,以便从 URL 中解析 Person 和 Sensor。例如:POST 到 `/api/datapoint// /',然后在创建(或更新,如果存在)数据点时从 URL 中提取 kwargs。
标签: django database-design django-rest-framework