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

Python 如何使用已设置的模型创建此对象?,python,database,django,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 = mod

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

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 ...
此模型设置的关系与此处绘制的关系类似:

键:红色=模式A,蓝色=模式B,绿色=模式D,灰色=模式D

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

我知道我可以做到这一点:

ModelA( .... data .... ).save()
>>> Mall.objects.get(name="Super Mall").shop_set.get(name="Second Shop").employee_set.all()
[<Employee: John>, <Employee: Carl>]
但这是最简单的例子。 任何帮助都将不胜感激

编辑:下面是一个让你头脑清醒的数据示例

动物园(模型A)有许多展品(模型B),其中有许多动物(模型C)和一个热水浴缸(模型D)


i、 e.不能将一个数据库点动态地指向多个表。解决方案是ModelB有一个ModelA的外键,然后您可以通过调用ModelA.Bs.all()之类的东西来找到ModelA的所有ModelB。创建包含其他对象的顶级对象时,通常最好从对其他对象依赖性最低的实体开始

假设您有这样一个模型:

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>]
>>来自myapp.models导入商场、商店、员工
>>>m=购物中心(名称=“超级购物中心”)
>>>m.save()
>>>Mall.objects.all()
[]
现在我们有了一个购物中心,我们应该能够创建只依赖于购物中心对象可用的对象。商店有通往商场的外国钥匙,员工有通往商店的外国钥匙。因为我们还没有店铺对象,所以我们需要先创建店铺对象,然后才能创建任何员工对象:

>>> 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>]
>>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()
[, ]
此时,Django中已经自动建立了一对多关系。这意味着我们现在可以键入以下内容:

>>> Mall.objects.get(name="Super Mall").shop_set.all()
[<Shop: First Shop>, <Shop: Second Shop>]
>>Mall.objects.get(name=“Super Mall”).shop\u set.all()
[, ]
现在唯一缺少的是每个商店的雇员对象:

>>> 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>]
e1=Employee(name=“Foo”,雇用人=Shop.objects.get(name=“First Shop”)) >>>e2=员工(name=“Bar”,雇佣人=Shop.objects.get(name=“First Shop”)) >>>e3=Employee(name=“John”,雇佣人=Shop.objects.get(name=“Second Shop”)) >>>e4=员工(name=“Carl”,雇佣人=Shop.objects.get(name=“Second Shop”)) >>>e1.save() >>>e2.save() >>>e3.保存() >>>e4.保存() >>>Employee.objects.all() [, , ] 就像之前一样,员工和店铺之间自动建立了一对多关系,我们可以获得特定店铺的所有员工,如下所示:

>>> s = Shop.objects.get(name="First Shop")
>>> s.employee_set.all()
[<Employee: Foo>, <Employee: Bar>]
>s=Shop.objects.get(name=“First Shop”)
>>>s.employee_set.all()
[, ]
在这一点上,我们还可以从顶级方式链接对数据库的访问-如果您想让所有员工都从特定的商店、特定的购物中心获得,您可以这样做:

ModelA( .... data .... ).save()
>>> Mall.objects.get(name="Super Mall").shop_set.get(name="Second Shop").employee_set.all()
[<Employee: John>, <Employee: Carl>]
>>Mall.objects.get(name=“Super Mall”).shop\u set.get(name=“Second shop”).employee\u set.all()
[, ]
我希望这能清楚地说明如何建立关系,以及创建对象的顺序

因此,在您的示例中,您将首先创建ModelA的对象(类似于my Mall)。然后,您将使用现有的ModelA对象创建ModelB对象(如我创建我的店铺),然后您最终可以使用ModelB对象创建ModelC和ModelD对象(如我对我的员工所做的)


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

我知道我用相反的顺序来表达这个例子。但这就是你建立模型的方式,我知道。我只是不知道如何从这样一个模型中编写对象创建代码。你是说我必须创建绿色和灰色,然后创建蓝色,然后在数据库中找到红色并将它们链接起来?如何链接它们,以及需要编写什么代码才能实现这一点。请是通用的。非常感谢。顺便说一句,我的模型是正确的。我想为这个模型编写代码。我现在有点不确定你的模型:你在问题中列出的是你想保留的模型吗?基于您的示例和绘图,这是没有意义的。你确定要保留这个吗?现在对我来说已经很晚了,但我明天会回来给你一个如何在代码中链接模型的例子。也许这对你来说更有意义。是的,我和另一个人一起看过:如果你回来帮助我,我将非常感激!试着从右到左阅读图表。我已经用顺序和如何访问引用对象的示例更新了我的答案。