我正在尝试使用我在下面设置的模型创建一个对象:
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
如何创建一个将其自身链接到正确的ModelA对象的ModelB对象。比如何创建ModelC和ModelD对象并将它们与正确的ModelB对象链接。
我知道我可以这样做:
ModelA( .... data .... ).save()
但这是最简单的情况。 任何帮助将不胜感激。
编辑:这是一个数据示例,让您了解一下。
动物园(ModelA),有许多展品(ModelB),有很多动物(ModelC)和热水浴缸(ModelD)
即。您不能动态地将数据库点指向许多表。解决方案是ModelB有一个ModelA的外键,然后你可以通过调用类似于:ModelA.Bs.all()
的东西找到ModelA的所有ModelB答案 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的对象(就像我对员工一样)。
如果您对某些事情不确定,请随意发表评论。