Python Django OneToMany设计?

Python Django OneToMany设计?,python,django,many-to-many,one-to-many,Python,Django,Many To Many,One To Many,我坚持用一些Django模型做一个简单的设计决定。 据我所知,这里不是一个外国人就是许多人 让我们以Django docs中的比萨饼/配料为例: class Topping(models.Model): # ... class Pizza(models.Model): # ... toppings = models.ManyToManyField(Topping) 这显然是一种多方面的关系 现在让我们再举一个例子。我有10辆自行车要借出去,还有一些设备(如头盔、手套)

我坚持用一些Django模型做一个简单的设计决定。 据我所知,这里不是一个外国人就是许多人

让我们以Django docs中的比萨饼/配料为例:

class Topping(models.Model):
    # ...

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)
这显然是一种多方面的关系

现在让我们再举一个例子。我有10辆自行车要借出去,还有一些设备(如头盔、手套)

那么模型应该是:

class Bike(models.Model):
    # ...

class Equipment(models.Model):
    # ...

class LendBike(models.Model):
    # ...
    bike = models.ForeignKeyField(Bike)
    equipment_1 = models.ForeignKey(Equipment)
    equipment_2 = models.ForeignKey(Equipment)
    ...

但是,如果我不知道有人得到了多少设备,我如何管理这个

我想这就是你想要的:

class Bike(models.Model):
    # ...

class Equipment(models.Model):
    # ...

class LendBike(models.Model):
    # ...
    bike = models.ForeignKeyField(Bike)
    equipments = models.ManyToManyField(Equipment)

LendBike
Equipment
之间的M2M关系通过这种方式,您可以分配任意数量的设备。

使用事件的设计可以帮助您跟踪用户的操作。 在下面的代码中,有3个类专门用于你的东西(自行车、手套、头盔),还有一个事件类,每次用户借用东西或渲染东西时都会实例化它

有了数据库中的所有这些数据,您可以实时了解您的物品(借来的或可用的)状态,并拥有所有物品的历史记录

您可以在stuff类中添加“lender”之类的字段,但它不是干巴巴的,可能会造成不一致性。另一方面,它可以帮助您避免创建不可能的事件(例如借用已经借用的东西)

如何知道某人目前拥有多少设备?

在扩展用户类的类中,添加如下方法:

def count_borrowed_equipment_per_user(self):
    nb_bikes = Bike.objects.filter(lender=self.user).count()
    nb_helmets = Helmet.objects.filter(lender=self.user).count()
    nb_gloves = Glove.objects.filter(lender=self.user).count()
    return nb_bikes, nb_helmets, nb_gloves
注意


我想说的是,在我看来,一般来说,在这种情况下,只有数据库不能确保功能的一致性。如果您的业务逻辑不好,即使设计良好,也很容易在数据库中插入垃圾:)

也许我不明白,但第一个代码示例似乎在这两种情况下都有效。如果你不能预见将存在多少浇头,你最好使用一个能够管理所有情况的解决方案。不,在第二个例子中,我每个只有一个浇头。例如,1片意大利腊肠,1个洋葱,1个蘑菇;)我将用一个更好的例子来编辑qeustion是的,到目前为止这很清楚。但是这种方式我可以多次送出一件设备。在这种情况下,您可能希望在设备上添加
lended
boolean字段,并且在返回之前不分配。这可能是一种方式。我正在考虑将LendBike对象的ID添加回设备(使用ForeignKey)。这也使我有可能看到设备对象正在使用的位置。但所有这些都感觉不对劲,因为数据库没有完全涵盖这些。谢谢你的回答,但这仍然让设备处于孤立状态。我没有机会查看设备对象是否在使用中以及在何处使用(另请参见bogdan的回答和评论)哦,我不明白您需要实时知道谁得到了什么。使用“事件”系统(请参阅我的更新代码),这是可能的。
def count_borrowed_equipment_per_user(self):
    nb_bikes = Bike.objects.filter(lender=self.user).count()
    nb_helmets = Helmet.objects.filter(lender=self.user).count()
    nb_gloves = Glove.objects.filter(lender=self.user).count()
    return nb_bikes, nb_helmets, nb_gloves