Какую модель/подход использовать для связи пространства и объектов в django

Я пытаюсь немного поиграть с django, поэтому я начал создавать "решение" для старой проблемы, которая у меня есть. Мой опыт в OO программировании и связи моделей не так уж велик, поэтому я прошу идей/путей/решений, как достичь моих целей.

Моя проблема:

  • Мне нужно определить пространственные объекты и связать их между собой например: здание 1, внутри есть этажи 1 и 2, внутри этажа 2 есть комнаты A и B

    .
  • В каждом типе "местоположения" я буду размещать "вещи" например: разместите 1 камеру в здании 1; разместите 1 камеру на этаже 2; разместите 1 камеру в комнате B

    .
  • Так что я могу архивировать результаты ниже: Здание 1: 3 камеры этаж 2: 2 камеры комната B: 1 камера

Я планировал архивировать это, используя старый метод таблицы для каждого типа объекта (здание, этаж, комната), но я немного застрял на том, как работать с различными вещами тем же способом (действия), особенно потому, что после работы с этим я должен поместить "людей" в уравнение, т.е. я могу поместить человека J в комнату 2 и установить камеру на него.

Заранее благодарю вас всех за все мысли (даже если это будет сказать забудьте это и закодируйте это), потому что я немного потерялся здесь :)

Попробуйте начать с этого:

models.py:

class Building(models.Model):
    #Building 1, 2 etc... Use Charfield if you want string name
    building_name = models.IntegerField()
    def __str__(self):
        return '{}'.format(self.building_name)
    
class Room(models.Model):
    #One Building can have many rooms -> One to many relationship -> Foreignkey
    building = models.ForeignKey(Building, on_delete=models.CASCADE)
    room_name = models
    def __str__(self):
        return '{}'.format(self.room_name)

#Since you want to put items such as camera on Objects (person can also be an object):
class ObjectInRoom(models.Model):
    room = models.ForeignKey(Room)
    object_in_room_name = models.CharField(max_length=256)
    def __str__(self):
        return '{}'.format(self.object_in_room_name)

#Items such as camera etc. 
class ItemOnObject(models.Model):
    object_in_room = models.ForeignKey(ObjectInRoom, on_delete=models.CASCADE)
    item_on_object_name = models.CharField(max_length=256)

    def __str__(self):
        return '{}'.format(self.item_on_object_name)

admin.py:

from django.contrib import admin
from .models import Building, Room, ObjectInRoom, ItemOnObject
# Register your models here.
admin.site.register(Building)
admin.site.register(Room)
admin.site.register(ObjectInRoom)
admin.site.register(ItemOnObject)

Не забудьте сделать миграции, используя python manage.py makemigrations и python manage.py migrate в вашей консоли.

Вы можете протестировать свои модели, запустив сервер с помощью python manage.py runserver и войдя в систему /admin. Если вы этого еще не сделали, создайте суперпользователя, чтобы иметь возможность войти на сайт администратора с помощью python manage.py createsuperuser.

реляционный проект

Изображение выше - это мой первый дизайн, теперь я немного изменил его, потому что я нашел некоторые "вещи/библиотеки", которые работают по-другому в python/django.

Попробую объяснить свои сомнения немного лучше: Есть ли способ связать объекты (например, камеру) с другими различными объектами (здание, комната, человек) без необходимости добавления дополнительного кода для этого?

NOTE: Поскольку я только что открыл счет, есть много вещей, которые я не могу сделать :) извините, что немного запутал мой собственный вопрос.

Я нашел решение.

class Placement(models.Model):
my_usetype = models.ForeignKey(UseType, on_delete=models.CASCADE)
my_source = models.ForeignKey(Object, on_delete=models.CASCADE, related_name='source')
my_destination = models.ForeignKey(Object, on_delete=models.CASCADE, related_name='destination')

Просто добавьте связанное_имя :)

Вернуться на верх