【问题标题】:Making models.py for Django Rest Framework Primary key and foreign key为 Django Rest Framework 制作 models.py 主键和外键
【发布时间】:2020-08-29 13:08:19
【问题描述】:

我做了一个这样的模型:

from django.db import models
import json

# Create your models here.
class Data(models.Model):
node_id = models.ForeignKey("Node", on_delete=models.CASCADE)
timestamp = models.DateTimeField()
vibration = models.IntegerField()
moisture = models.IntegerField()
gps_latitude = models.CharField(max_length=250)
gps_longitude = models.CharField(max_length=250)
gyro_x = models.FloatField()
gyro_y = models.FloatField()
gyro_z = models.FloatField()
accelero_x = models.FloatField()
accelero_y = models.FloatField()
accelero_z = models.FloatField()
displacement = models.IntegerField()


class Node(models.Model):
node_id = models.IntegerField()
latitude = models.CharField(max_length=250)
longitude = models.CharField(max_length=250)
lokasi = models.CharField(max_length=500)

数据模型的端点位于http://127.0.0.1:8000/api/data/ 节点模型的端点位于http://127.0.0.1:8000/api/node/ 我希望 Node 类中的 node_id 成为主键,而 Data 类中的 node_id 成为外键。 我尝试像这样发帖到http://127.0.0.1:8000/api/node/

    {
    "node_id": 1,
    "latitude": "123",
    "longitude": "123",
    "lokasi": "eer"
}

然后我在http://127.0.0.1:8000/api/data/ 打开数据模型的端点以发布一些数据。 在 Node id 字段上,它应该是指 node_id=1,但为什么它只是指 node object(8),它是从 Django rest 框架自动生成的 id?

它使帖子数据看起来像这样:

{
"id": 13,
"timestamp": "2020-04-14T20:00:00+07:00",
"vibration": 1,
"moisture": 1,
"gps_latitude": "123",
"gps_longitude": "123",
"gyro_x": 1.0,
"gyro_y": 1.0,
"gyro_z": 1.0,
"accelero_x": 1.0,
"accelero_y": 1.0,
"accelero_z": 1.0,
"displacement": 1,
"node_id": 8}

“node_id”:应该是 1 而不是 8。 我的模型有问题吗?

【问题讨论】:

  • 如果我理解正确,您正在使用自定义主键将其重命名为 node_id 而不是 id
  • 是的,我不使用 id 作为主键。 id是系统自己生成的,我不对id做任何事情

标签: python django django-rest-framework


【解决方案1】:

根据关系,我认为是 1:N (Node:Data)

因此,如果您将模型重写为:

class Node(models.Model):
    latitude = models.CharField(max_length=250)
    longitude = models.CharField(max_length=250)
    lokasi = models.CharField(max_length=500)

    def __str__(self):
        return self.lokasi


class Data(models.Model):
    node_id = models.ForeignKey(Node, related_name="data", on_delete=models.CASCADE)
    timestamp = models.DateTimeField()
    vibration = models.IntegerField()
    moisture = models.IntegerField()
    gps_latitude = models.CharField(max_length=250)
    gps_longitude = models.CharField(max_length=250)
    gyro_x = models.FloatField()
    gyro_y = models.FloatField()
    gyro_z = models.FloatField()
    accelero_x = models.FloatField()
    accelero_y = models.FloatField()
    accelero_z = models.FloatField()
    displacement = models.IntegerField()

所以现在您可以在创建数据模型时通过 id 分配 Node,反之亦然,您可以通过调用从 Node 分配数据对象的集合

Node.objects.first().data.all()

广告:为什么它只是指节点对象(8)

您需要添加一个__str__ 方法,该方法将告诉 Django 在转换为字符串时如何解释您的对象,因此我在您的 Node 类中添加了一个示例

节点将 id 字段作为自动生成的主键,node_id 作为 Node 的外键

【讨论】:

  • 我把这个放在哪里:Node.objects.first().data.all() ?
  • 我仍然需要在 Node 类上发布 node_id。然后那个 node_id 成为 Data 类的主键
  • 在 django 应用程序中的任何位置,您都可以在运行 python manage.py shell 时对其进行修改
  • 对不起,我仍然需要 Node 类的 node_id。之后 Node 类中的 node_id 成为 Data 类的主键。该怎么做?
  • 你有节点的ID,它是它的PrimaryKey,叫做id。 ForeignKey 用于使用其 ID 分配给定表中的现有记录,您想从节点添加数据,因此该节点需要存在。如果您的目标是仅发布 Data 对象并在节点尚不存在时自动创建节点,则需要覆盖对象的保存方法并手动执行此操作
【解决方案2】:

由于您正在尝试为 GPS 系统设计后端,我建议您首先检查 https://github.com/openwisp/django-rest-framework-gishttps://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/ 并牢牢掌握 Django 模型和查询 API。这并不完全是解决您的问题的方法,而是在检查您的代码和线程上的其他相关 cmets 之后的更多高级建议。这些将帮助您更轻松地开发 GIS API。

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2019-07-02
    • 2016-01-09
    • 2011-04-10
    • 2013-03-06
    • 2015-03-27
    • 2021-06-25
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多