django - 将 django-treebeard 模型与另一个 django 模型作为外键链接的正确方法是什么?
问题描述
我正在构建一个系统,该系统将显示城市中每个体育场周围的重要设施,如车站、火车站、医院、餐馆和酒吧等,以及它们与各个体育场的距离。我在 Django 中有两个模型,一个用于体育场,另一个用于体育场周围的设施。如果设施有多个选项,则设施可以是分层的。例如
Stadium-1:
-医院
:
-某医院:700米-餐厅:-
中餐:
-abc餐厅
:2公里
-意大利:
-lmn餐厅:300米-xyz餐厅
:1.2 公里
每棵树的根节点的名称将与它作为外键链接到的体育场的名称相同。每个体育场都有自己的树,指定周围的重要设施以及它们与体育场的距离。
我正在使用 Django-Treebeard 来创建设施树。我的设施模型是 MP_Node 类型。我正在使用管理界面添加我的数据。
当我尝试将体育场与设施树链接时,它会显示所有树模型中添加的每个节点。这很乱。想象一下当数据增长时。会很麻烦的。
我试图将其链接为 OneToOneField 但没有任何改变。目前,我正在使用外键链接两个模型。以下是我的实际模型:
######################## models.py ##################################
class NearByFacilities(MP_Node):
name = models.CharField(max_length=65, blank=True, null=True)
distance = models.DecimalField(max_digits=5, decimal_places=2, blank=True,
null=True)
units = (
('km', 'KiloMeters'),
('m', 'meters')
)
unit = models.CharField(max_length=3, choices=units, blank=True,
null=True)
def __str__(self):
if self.name:
return (self.name)
else:
return str(self.distance)
class Stadium(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
name = models.CharField(max_length=65)
capacity = models.PositiveIntegerField()
built = models.CharField(max_length=20, blank=True, null=True)
near_by_facilities = models.ForeignKey(
NearByFacilities, related_name='stadium', on_delete=models.CASCADE)
def __str__(self):
return self.name
##################### admin.py file: ###################################
from __future__ import unicode_literals
from django.contrib import admin
from treebeard.admin import TreeAdmin
from treebeard.forms import movenodeform_factory
from .models import (
Stadium,
NearByFacilities
)
class NearByFacilitiesAdmin(TreeAdmin):
fields = ('name', 'distance', 'unit',
'_position', '_ref_node_id',)
form = movenodeform_factory(NearByFacilities)
admin.site.register(Stadium)
admin.site.register(NearByFacilities, NearByFacilitiesAdmin)
我的屏幕截图显示了将设施树链接到其各自的体育场时会发生什么: 1. 添加节点时:
它显示了所有树中的所有节点。我知道我在这里做错了什么。
我的问题是:
这里的正确方法是什么?我构建模型的方式有问题吗?有没有为此目的的替代方法?
解决方案
推荐阅读
- c++ - onTimer() 不触发
- python - Python:将字符串中单词的第一个字符大写,除了一个单词
- android - Android camera-2 API 录制预览在三星 Galaxy S8 的人像录制中被挤压
- visual-studio-code - angular 7 array push() 方法在 Visual Studio 代码中显示错误警告但运行正常
- reactjs - 如果定义了其他属性,则打字稿需要该属性(requiredIf)
- java - 当我移动到 TabLayout 索引 2 时,Getdata SQLite 错误
- javascript - 数组重新循环以删除先前生成的一组数组数据
- c# - 在 ASP.NET Core 中下载远程 PDF 时未配置设备
- oracle - SUBQUERIES数据库Oracle上的无效标识符
- python - 将嵌套字典元素移动到顶层并让剩余的嵌套元素值跟随 | 蟒蛇 | 姜戈