如何使用我设置的模型创建此对象?

时间:2014-01-25 04:06:05

标签: python database django

我正在尝试使用我在下面设置的模型创建一个对象:

class ModelA(models.Model)
    ... irrelevant data ...

class ModelB(models.Model)
    fk = models.ForeignKey(ModelA, blank=True, null=True, related_name="Bs")
    ... irrelevant data ...

class ModelC(models.Model)
    fk = models.ForeignKey(ModelB, blank=True, null=True, related_name="Cs")
    ... irrelevant data ...

class ModelD(models.Model)
    fk = models.ForeignKey(ModelB, blank=True, null=True, related_name="Ds")
    ... irrelevant data ...

此模型建立的关系类似于此处描绘的关系:

KEY:RED = ModelA,BLUE = ModelB,GREEN = ModelD,GRAY = ModelD model relationship

如何创建一个将其自身链接到正确的ModelA对象的ModelB对象。比如何创建ModelC和ModelD对象并将它们与正确的ModelB对象链接。

我知道我可以这样做:

ModelA( .... data .... ).save()

但这是最简单的情况。 任何帮助将不胜感激。

编辑:这是一个数据示例,让您了解一下。

动物园(ModelA),有许多展品(ModelB),有很多动物(ModelC)和热水浴缸(ModelD)

即。您不能动态地将数据库点指向许多表。解决方案是ModelB有一个ModelA的外键,然后你可以通过调用类似于:ModelA.Bs.all()

的东西找到ModelA的所有ModelB

1 个答案:

答案 0 :(得分:2)

创建包含其他对象的顶级对象时,通常最好先从依赖于其他对象的实体开始。

让我们假设您有这样的模型:

from django.db import models

class Mall(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return u"%s" % (self.name)

class Shop(models.Model):
    name = models.CharField(max_length=200)
    mall = models.ForeignKey(Mall)

    def __unicode__(self):
        return u"%s" % (self.name)

class Employee(models.Model):
    name = models.CharField(max_length=200)
    hired_by = models.ForeignKey(Shop)

    def __unicode__(self):
        return u"%s" % (self.name)

从这个例子可以清楚地看出,创建一个Mall对象并不依赖于任何其他类 - 因为它没有这些的ForeignKey。所以我们应该首先在数据库中创建一个Mall对象:

>>> from myapp.models import Mall, Shop, Employee
>>> m = Mall(name="Super Mall")
>>> m.save()
>>> Mall.objects.all()
[<Mall: Super Mall>]

现在我们有了一个Mall,我们应该能够创建仅依赖于Mall对象可用的对象。商店有一个ForeignKey到商城,员工有一个ForeignKey购物。由于我们还没有Shop对象,因此我们需要在创建任何Employee对象之前创建Shop对象:

>>> s1 = Shop(name="First Shop", mall = Mall.objects.get(name="Super Mall"))
>>> s2 = Shop(name="Second Shop", mall = Mall.objects.get(name="Super Mall"))
>>> s1.save()
>>> s2.save()
>>> Shop.objects.all()
[<Shop: First Shop>, <Shop: Second Shop>]

此时,已经在Django中自动建立了一对多的关系。这意味着我们现在可以输入以下内容:

>>> Mall.objects.get(name="Super Mall").shop_set.all()
[<Shop: First Shop>, <Shop: Second Shop>]

现在唯一缺少的是每个商店的员工对象:

>>> e1 = Employee(name="Foo", hired_by=Shop.objects.get(name="First Shop"))
>>> e2 = Employee(name="Bar", hired_by=Shop.objects.get(name="First Shop"))
>>> e3 = Employee(name="John", hired_by=Shop.objects.get(name="Second Shop"))
>>> e4 = Employee(name="Carl", hired_by=Shop.objects.get(name="Second Shop"))
>>> e1.save()
>>> e2.save()
>>> e3.save()
>>> e4.save()
>>> Employee.objects.all()
[<Employee: Foo>, <Employee: Bar>, <Employee: John>, <Employee: Carl>]

就像在员工和商店之间自动设置一对多关系之前一样,我们可以为这样的特定商店获得所有员工:

>>> s = Shop.objects.get(name="First Shop")
>>> s.employee_set.all()
[<Employee: Foo>, <Employee: Bar>]

此时我们还可以从顶级方式链接访问数据库 - 如果您希望从特定商店获得所有员工,您可以在特定商场中执行此操作:

>>> Mall.objects.get(name="Super Mall").shop_set.get(name="Second Shop").employee_set.all()
[<Employee: John>, <Employee: Carl>]

我希望这可以清楚地说明如何建立关系,以及创建对象的顺序。

因此,在您的示例中,您将首先创建ModelA的对象(类似于我的Mall)。然后,您将使用现有的ModelA对象(比如我创建我的Shop)创建ModelB的对象,然后您最终可以使用ModelB对象创建ModelC和ModelD的对象(就像我对员工一样)。

如果您对某些事情不确定,请随意发表评论。