如何存储以特定顺序引用其他几个对象的对象?

时间:2017-09-21 09:48:08

标签: python django

我正在开发一个包含三个主要类的Django项目:A类,B类和C类.C类中的对象由特定顺序的A和B类对象组成。所有这些都存储在MySQL数据库中。

目前我有:

class A(models.Model):
    name = models.CharField(max_length=250)

class B(models.Model):
    name = models.CharField(max_length=250)

class C(models.Model):
    name = models.CharField(max_length=250)
    composed_of = PickledObjectField(blank=True)

因此,要创建C对象,请执行以下操作:

c1 = C()
c1.composed_of = [a1, b4, a1, b1, a2, b2, b3, b4, a2, a5]
c1.save()

a1..a5是B的实例和b1..b5实例。

这有效但但并不好,原因有两个:1。当我需要查询这个字段时,这很糟糕; 2.如果从数据库更新或删除A或B的实例,则不会在C实例中完成更改。

因此我的问题是:如何使用以特定顺序引用其他类的实例的实例创建一个类?

我正在使用Django 1.8和Python 2.7。

1 个答案:

答案 0 :(得分:1)

首先,如果您想引用其他模型,您应该使用多对多关系(models.ManyToManyField)。

其次,由于您要引用不同的模型,因此需要使用Django contenttypes framework中的通用外键,以便链接到您想要的任何类型。现在有一个很好的blog post代码,其中包含如何将其应用于多对多关系的代码。

第三,既然你想订购关系的对象,你需要用order_number提供每个关系,这样你就需要一个所谓的through表(documentation here )。

当事情发生变化时管理这些订购号会变得非常复杂,有一个很好的解决方案可以解决这个问题:django-ordered-model,但我确信还有其他的。寻找“在Django中订购多对多关系”。您可能必须自定义在通用m2m关系上使用它。