Как правильно связать модель django-treebeard с другой моделью django в качестве Foreignkey? - PullRequest
1 голос
/ 25 июня 2019

Я строю систему, которая будет показывать важные объекты вокруг каждого стадиона в городе, такие как склады, железнодорожные станции, больницы, рестораны и бары и т. Д., А также их расстояние от соответствующего стадиона. У меня две модели в Джанго, одна для стадиона, а другая для помещений вокруг стадиона. Услуги могут быть иерархическими, если есть несколько вариантов для одного и того же. Например.

Стадион-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

  1. Дерево финальных услуг:

    enter image description here

  2. При соединении с соответствующим стадионом: **enter image description here**

Показывает все узлы на всех деревьях. Я знаю, что я делаю что-то не так здесь.

Мои вопросы:
Какой правильный путь здесь? Есть ли проблема с тем, как я структурировал модели? Есть ли альтернативный подход для этой цели?

...