簡體   English   中英

為 Django Rest 框架制作models.py 主鍵和外鍵

[英]Making models.py for Django Rest Framework Primary key and foreign key

我做了一個這樣的模型:

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)

The Data models have endpoint at http://127.0.0.1:8000/api/data/ And Node models have endpoint at http://127.0.0.1:8000/api/node/ I want the node_id in Node class to become a主鍵和來自數據 class 的 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? API 數據模型

它使發布數據看起來像這樣:

{
"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。我的模型有什么問題嗎?

根據關系,我認為是 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()

因此,現在您可以在創建數據 model 時按 id 分配節點,反之亦然,您可以通過調用從節點分配數據對象的集合

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

廣告:為什么它只是指節點對象(8)

您需要添加一個__str__方法,該方法將告訴 Django 在轉換為字符串時如何解釋您的 object,因此我在您的節點 class 中添加了一個示例

節點將具有id字段作為自動生成的主鍵和node_id作為Node的外鍵

由於您正在嘗試為 GPS 系統設計后端,我建議您檢查https://github.com/openwisp/django-rest-framework-gis &Z5E056C500A1C4B6A7110//docs.BadejangoD807 ref/contrib/gis/tutorial/首先並牢牢掌握 Django 模型和查詢 API。 這不完全是解決您的問題的方法,而是在檢查您的代碼和線程上的其他相關評論后提供的更多高級建議。 這些將幫助您更輕松地開發 GIS API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM