Я строю систему, которая будет показывать важные объекты вокруг каждого стадиона в городе, такие как склады, железнодорожные станции, больницы, рестораны и бары и т. Д., А также их расстояние от соответствующего стадиона. У меня две модели в Джанго, одна для стадиона, а другая для помещений вокруг стадиона. Услуги могут быть иерархическими, если есть несколько вариантов для одного и того же. Например.
Стадион-1:
-Hospital:
- какая-то больница: 700 метров
-Ресторан:
- китайский:
- ресторан ABC: 2 км
- итальянский:
- ресторан: 300 метров
- ресторан XYZ: 1,2 км
Имя корневого узла для каждого дерева будет таким же, как и имя стадиона, с которым оно будет связано как иностранный ключ. У каждого стадиона будет свое дерево с указанием важных объектов вокруг него и расстояний до стадиона.
Я использую Django-Treebeard для создания дерева объектов. Моя модель объектов типа MP_Node. Я использую интерфейс администратора, чтобы добавить свои данные.
Когда я пытаюсь связать стадион с деревом объектов, он показывает каждый узел, который когда-либо был добавлен во всех моделях деревьев. Это грязно. Представьте, когда данные растут. Это будет проблемой.
Я пытался связать его как OneToOneField, но ничего не изменилось.
В настоящее время я использую Foreignkey для связи обеих моделей. Ниже приведены мои актуальные модели:
######################## 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. При добавлении узла:
![enter image description here](https://i.stack.imgur.com/Af8vg.png)
Дерево финальных услуг:
![enter image description here](https://i.stack.imgur.com/11mHU.png)
При соединении с соответствующим стадионом:
![**enter image description here**](https://i.stack.imgur.com/6Irhf.png)
Показывает все узлы на всех деревьях.
Я знаю, что я делаю что-то не так здесь.
Мои вопросы:
Какой правильный путь здесь? Есть ли проблема с тем, как я структурировал модели? Есть ли альтернативный подход для этой цели?