Django:在内存中建立关系而不保存到DB

时间:2011-10-26 20:15:31

标签: django django-models

我有一些模特有这样的关系:

class Item(model.Model):
    name = models.CharField()

class Group(models.Model):
    item = models.ManyToManyField(Item)

class Serie(models.Model):
    name = models.CharField()
    chart = models.ForeignKey(Chart)
    group = models.ForeignKey(Group)

class Chart(models.Model):
    name = models.CharField()

我需要动态创建Chart对象,而不保存到DB。但我无法做到这一点,因为Django在分配关系时会尝试使用对象主键。

我只想让Group.add(Item())无需将对象保存到数据库即可工作。

有什么简单的方法吗?

2 个答案:

答案 0 :(得分:5)

为了未来的读者而在这里复兴:

我通过定义一个表示类内部关系的私有属性和一个要检查的属性来解决这个用例,可以从DB检索对象或驻留在内存中。

这是一个简单的例子:

class Parent(models.Model):
    _children = []
    name = models.CharField(max_length=100)

    @property
    def children(self):
        if _children:
            return self._children
        else:
            return self.children_set.all()

    def set_virtual_children(self, value):  # could use a setter for children
        self._children = value  # Expose _children to modification

    def some_on_the_fly_operation(self):
        print(','.join([c.name for c in self.children]))   


 class Children(models.Model):
     parent = models.ForeignKey(Parent)
     name = models.CharField(max_length=100)

通过这种方式,我可以设置"虚拟孩子"并使用所有已定义的方法"即时#34;

答案 1 :(得分:0)

编辑:似乎这里描述的方法不足以让django允许添加到ManyToMany关系。

您是否尝试将primary_key=Trueunique=True添加到Item模型的name属性中。如果您有可能动态创建Group.add(Item("item_name_here")),则name应该有效。

我没有测试它,但我认为你的方式失败了,因为add()想要使用主键,默认情况下,它是在保存到数据库时分配的自动增量id。