在创建包含其他对象的顶级对象时,通常最好从最不依赖其他对象的实体开始。
假设你有一个这样的模型:
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 对象可用的对象。 Shop 有一个 ForeignKey 到 Mall, Employee 有一个 ForeignKey 到 Shop。由于我们还没有 Shop 对象,因此我们需要先创建一个 Shop 对象,然后才能创建任何 Employee 对象:
>>> 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>]
现在唯一缺少的是每个商店的 Employee 对象:
>>> 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>]
就像在 Employee 和 Shop 之间自动建立一对多关系之前,我们可以像这样获取特定商店的所有员工:
>>> 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 对象创建 ModelB 的对象(就像我创建我的 Shop),然后您最终可以使用您的 ModelB 对象创建 ModelC 和 ModelD 的对象(就像我对我的员工所做的那样)。
如果您不确定,请随时发表评论。