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

Fac*_*sco 5 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()
Run Code Online (Sandbox Code Playgroud)

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

我只想Group.add(Item())工作,而不必将对象保存到数据库.

这有什么简单的方法吗?

Alv*_*aro 5

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

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

这是一个简单的例子:

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)
Run Code Online (Sandbox Code Playgroud)

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


Lyc*_*cha 0

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

您是否尝试过将primary_key=True和添加unique=TruenameItem 模型的属性中。如果您有可能即时Group.add(Item("item_name_here"))创建,那么这样做应该可行。name

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