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

2024-10-08 20:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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 ...

此模型建立了一个类似于此处所示的关系:

键:红色=ModelA,蓝色=ModelB,绿色=ModelD,灰色=ModelD model relationship

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

我知道我能做到:

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

但这是最简单的例子。 任何帮助都将不胜感激。你知道吗

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

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

也就是说,不能让一个数据库点动态指向多个表。解决方案是ModelB有一个ModelA的外键,然后您可以通过调用以下命令来找到ModelA的所有ModelB:模型A.Bs.all()


Tags: 对象模型truedatamodelmodelsnullclass
1条回答
网友
1楼 · 发布于 2024-10-08 20:15:46

在创建包含其他对象的顶级对象时,通常最好从对其他对象依赖性最小的实体开始。你知道吗

假设您有这样一个模型:

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>]

既然我们有了一个商城,我们应该能够创建只依赖于有一个商城对象可用的对象。商店有一把通往商场的外国钥匙,雇员有一把通往商店的外国钥匙。因为我们还没有商店对象,所以我们需要先创建一个商店对象,然后才能创建任何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>]

就像以前一样,员工和商店之间自动建立一对多关系,我们可以获得特定商店的所有员工,如下所示:

>>> 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对象(类似于mymall)。然后您将使用现有的ModelA对象创建一个ModelB对象(就像我创建我的商店一样),最后您可以使用ModelB对象创建ModelC和ModelD对象(就像我对我的员工所做的那样)。你知道吗

如果你对某事不确定,请随时发表评论。你知道吗

相关问题 更多 >

    热门问题