Какую модель/подход использовать для связи пространства и объектов в 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')
Просто добавьте связанное_имя :)