什么 model/approach 用来关联 space 和 django 中的对象

What model/approach to use to relate space and objects in django

我正在尝试使用 django,所以我已经开始为我遇到的一个老问题创建一个“解决方案”。 我在 OO 编程和模型关系方面的背景并不多,所以我要求 ideas/paths/solutions 如何实现我的目标。

我的问题:

我计划使用旧方法 table 对每种对象(建筑物、地板、房间)进行归档,但我对如何以相同的方式处理不同的东西有点困惑方式(动作)特别是因为在处理完这个之后我必须把“人”放在等式中,即我可以把人 J 放在房间 2 并在他身上放一个摄像头。

我提前感谢大家的所有想法(即使是说忘记它并编码它)因为我在这里有点迷路:)

抱歉,如果这不是正确的方式(第一个 post): @Amun_Re 我的文字不太好,尤其是英语。您 post 在我的第一个数据库对象关系中编辑的模型,但在发现多对多关系后我在想(因为我需要将对象放在房间、地板和建筑物中,它们是不同的)django/python 有更好的方法来处理这个问题。 我会尝试 post 我为这个阶段设计的图像。

好吧,在重新考虑所有事情之后,我尝试从 OO 的角度来看。如果他们要被同等对待,他们至少需要来自同一个地方。 现在我有一个 class“对象”,所有其他 classes 都继承自(建筑物、楼层、人...),但现在我遇到了一个问题,当我尝试放置一个人时在建筑物上我收到错误:

from django.db import models
from numpy import source
from objects.models import Asset, Object
# Create your models here.

class UseType(models.Model):
    name = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return str(self.name)


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

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.created)

我能做到吗?或者我应该只使用整数字段而不是外键然后只在表单上更新?

TIA

尝试从这个开始:

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 makemigrationspython manage.py migrate 进行迁移。

您可以通过 运行 使用 python manage.py runserver 服务器并登录 /admin 来测试您的模型。如果您还没有,请创建一个超级用户以便能够使用 python manage.py createsuperuser.

登录管理站点

relational draft

上图是我的第一个设计,现在我稍微修改了一下,因为我发现一些“stuff/library”在 python/django 中工作不同。

让我试着更好地解释一下我的疑惑: 有没有一种方法可以将对象(如相机)与其他不同类型的对象(建筑物、房间、人)相关联,而无需为此添加额外的代码?

注意:因为我刚刚开户,所以有很多事情我不能做:)抱歉打乱了我自己的问题。

我找到了解决方案。

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')

只需添加 related_name :)