簡體   English   中英

如何使用已建立的模型創建該對象?

[英]How do I create this object with the models I have set up?

我正在嘗試使用下面設置的模型創建一個對象:

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()

但這就是最簡單的情況。 任何幫助將不勝感激。

編輯:這是一個數據示例,可以使您的頭腦轉轉。

一個動物園(模型A),有很多展品(模型B),有很多動物(模型C)和一個熱水浴缸(模型D)

即,您不能動態地將數據庫指向多個表。 解決方案是ModelB具有ModelA的外鍵,然后可以通過調用以下代碼找到ModelA的所有ModelB:ModelA.Bs.all()

創建包含其他對象的頂級對象時,通常最好從最小依賴其他對象的實體開始。

假設您有一個這樣的模型:

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對象,因此我們需要先創建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對象(就像我對Employee所做的那樣)。

如果您不確定某些事情,請隨時發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM