2011-10-26 130 views
3

我有一些机型,像这样的关系:Django的:使内存的关系,而不保存到数据库

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

我需要动态创建一个图表对象,而不保存到数据库。但我不能这样做,因为Django在分配关系时尝试使用对象主键。

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

有没有简单的解决方法呢?

+0

我相信你在图表传递给要显示的前端?为什么不使用普通的python对象? –

+0

因为我有这些对象的其他方法,我想使用它们而不必在两个类上重写它们 –

回答

0

编辑:似乎这里描述的方法是不够的Django允许添加到ManyToMany关系。

您是否尝试将primary_key=Trueunique=True添加到Item模型的name属性中。如果您有可能在运行中创建name,那么应该使用Group.add(Item("item_name_here"))

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

+0

我需要保留模型的主键,我只是希望Djanto不要查找主键如果我不想保存任何对象。 –

+0

@FC在这种情况下,我猜想这是不可能的。顺便说一句。我认为即使添加我建议的主键也不够。 – Lycha

3

回想起这里未来的读者着想:

我已经通过定义一个代表类中的关系,并检查羯羊对象的属性私有属性解决这个用例可以得到从检索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) 

这样一来,我可以设置“虚拟儿童”,并使用所有“对飞”的定义的方法

相关问题