如何在单个模型中存储同一对象的多个实例?

时间:2014-08-31 21:13:31

标签: python django

以下是我的model.py的样子:

class Person(models.Model):
    person_name = models.CharField(max_length=50)
    owned_items = models.ForeignField("Item")

class Item(models.Model):
    item_name = models.CharField(max_length=50)
    item_description = models.TextField()

这是我想要存储的数据

item1 = Item(item_name="keyboard", item_description="computer keyboard)
item2 = Item(item_name="monitor", item_description="used to visualize data")

我的person拥有item1item2,但我不确定如何存储它们:

person = Person(person_name="John Smith", owned_items= ???????)

1 个答案:

答案 0 :(得分:3)

您的对象关系错误。如果一个人可以拥有多个项目,但每个项目只能由一个人拥有,那么这是itemperson之间的多对一关系,应由{{3}表示ForeignField上的{not Item)字段,例如:

class Item(models.Model):
    item_name = models.CharField(max_length=50)
    item_description = models.TextField()
    owner = Models.ForeignKey(Person)

然后,您可以将给定owner实例的Item设置为Person实例,或者使用item_set外部密钥管理器Person实例:

newperson = Person(person_name="John Smith")
newperson.save()
newmonitor = Item(item_name="monitor", item_description="used to visualize data", owner=newperson)
newmonitor.save()
# if owner is a nullable field:
newkeyboard = Item(item_name="keyboard", item_description="computer keyboard")
newkeyboard.save()
newperson.item_set.add(newkeyboard)
newperson.save()

如果每个项目可以由多个人拥有,比如因为您对所有键盘使用单个Item记录,那么这是一个多对多关系,应该用ForeignKey来表示。这样的字段可以在任一模型上声明 - 在这种情况下,在Person上声明它可能更方便:

class Person(models.Model):
    person_name = models.CharField(max_length=50)
    owned_items = models.ManyToManyField("Item")

文档展示了如何使用多对多字段 - 您通常会创建或查找Item个实例,而不是调用someperson.owned_items.add(some_item)